【发布时间】:2016-04-07 13:37:05
【问题描述】:
我开始学习在 C 中输入字符串。在下面的源代码中,我得到了一个长度为 5 的字符数组。
#include<stdio.h>
int main(void)
{
char s1[5];
printf("enter text:\n");
scanf("%s",s1);
printf("\n%s\n",s1);
return 0;
}
当输入是:
-
1234567891234567,我检查了它最多可以使用 16 个元素(我不明白,因为它超过 5 个元素)。 -
12345678912345678,它给了我一个错误segmentation fault: 11(在这种情况下我给出了 17 个元素) -
123456789123456789,错误是Illegal instruction: 4(本例我给了18个元素)
我不明白为什么会有不同的错误。这是scanf() 的行为还是C 中的字符数组?我正在阅读的那本书对这些事情没有明确的解释。仅供参考,我对指针一无所知。对此的任何进一步解释都会非常有帮助。
【问题讨论】:
-
当输入的长度超过 4 个字符时,行为是 undefined。 未定义的行为并不意味着“必须立即崩溃”,它意味着该语言没有义务做任何特别的事情。
-
但是当输入的长度超过 5 个字符时它不应该给我一个错误吗?
-
@buggenerator:这不是违反约束,编译器没有义务发出诊断消息,也没有要求在运行时引发错误。
-
@buggenerator 您需要了解,如果您想在做错事后立即收到消息错误,C 语言不适合您。 C 是为了效率,编译器添加最少的控件以确保它可以生成最有效的程序。