gpt4 book ai didi

c - 如何在 C 中处理数组边界

转载 作者:太空宇宙 更新时间:2023-11-04 05:38:36 25 4
gpt4 key购买 nike

在C语言中有什么方法可以处理错误索引越界

我只是想知道,请在这个例子的上下文中解释它。如果我输入超过 20 个字符的字符串,我会得到 * stack smashing detected *: ./upper1 terminated中止(核心转储)

main()
{
char st[20];
int i;

/* accept a string */
printf("Enter a string : ");
gets(st);

/* display it in upper case */
for ( i = 0 ; st[i] != '\0'; i++)
if ( st[i] >= 'a' && st[i] <= 'z' )
putchar( st[i] - 32);
else
putchar( st[i]);
}

我想像在 Java 的异常处理中那样处理并停止它们并显示自定义消息。是否可以 ?如果是如何

提前致谢

最佳答案

要回答最初的问题:在 C 中无法隐式处理越界数组索引。您应该在代码中显式添加该检查,或者您应该证明(或至少绝对确定)它不会发生。当心buffer overflow及其他undefined behavior , 它会伤害 lot .

请记住,C 数组在运行时“不知道”它们的大小。您应该知道并管理该大小,尤其是在传递数组时(它会变成指针)。另请阅读 struct-s 中的灵活数组成员(如 here )。

顺便说一句,您的代码品味很差。首先,char st[20]; 现在真的太小了:一个输入行实际上可以有一百个字符(我的终端仿真器经常超过 80 列)。所以让它成为例如

 char st[128];

然后,就像每个人都告诉你的那样,gets(3)是危险的,它被记录为“永远不要使用这个功能”。养成阅读您敢于使用的每个功能的文档的习惯。

我建议总是用

清除这样的字符串缓冲区
memset (st, 0, sizeof st);

你至少应该使用 fgets(3) ,但请先阅读文档。您需要处理失败案例。

此外,您转换为大写字母特定于 ASCII(和其他一些编码)。它不适用于旧的 EBCDIC机器。它是不可读的。所以使用 isalpha(3)检测字母(以 ASCII 或其他单字节编码);但在 UTF-8它更复杂,因为一些字母 - 例如 cyrillic ones- 在 几个 字节上编码)。我的姓氏(СТАРЫНКЕВИЧ 俄语拼写时)包含一个 Ы - 这是一个名为 yery 的字母- 大写字母的 UTF-8 编码是 两个 字节的 0xD0 0xAB。你需要一个像 unistring 这样的 UTF-8 库来处理这些。并使用 toupper(3)将(例如 ASCII)字母转换为大写。

请注意,您的 main 函数定义错误。它应该返回一个 int 并且最好声明为 int main(int argc, char**argv)

最后,在 Posix 系统上,读取一行的“正确”方法是使用 getline(3)功能。它可以在系统资源允许的范围内读取一行(因此它可能在我的机器上读取一百万个字符的行)。参见 this answer .

关于异常,C 并没有真正的异常(所以大多数程序员习惯于让函数给出一些错误代码)。但是,对于非本地跳转,请考虑 setjmp(3) 非常小心使用。 (在 C++ 中,有异常,它们与析构函数有关)。

不要忘记使用所有警告和调试信息进行编译(例如,如果使用 GCC,则使用 gcc -Wall -g)。您绝对需要学习如何使用调试器(例如gdb)并且您还应该使用memory leak。像valgrind这样的探测器.

关于c - 如何在 C 中处理数组边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25833028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com