如果我输入大于10的字符串,那么为什么不生成编译时错误,因为我已声明大小为10的str
?例如,我输入welcome to the world
,然后编译并运行,没有错误。
#include <stdio.h>
#include <conio.h>
int main() {
int i = 0, length;
char str[10];
printf("enter string: ");
gets(str);
while (str[i] !='\0') {
i = i + 1;
}
length = i;
printf("the length of string is %d", length);
}
答案 0 :(得分:5)
输入字符串是运行时实体。任何涉及它的计算都无法在编译时执行,因此您可以做的最好的事情是引发运行时错误。
此外,{C}中已将gets
标记为已弃用并且只是从C11中删除,因为无法防止这种不安全的行为:没有人抱怨,您可以编写超出数组边界的内容,这是未定义的行为。请改用fgets
,以提供更高级别的安全性。
答案 1 :(得分:1)
因为fgets
不接受长度参数,所以它不知道输入缓冲区有多大。
您可以使用false
代替
答案 2 :(得分:1)
未定义的行为。任何事情都可能发生。
永远不要使用gets()
,因为它不会阻止缓冲区溢出,这正是您的程序正在执行的操作。使用fgets()
代替gets()
。
fgets()
可以防止超出该范围的数组大小。
fgets(array, sizeOfArray, stdin);
答案 3 :(得分:0)
因为您将字符串长度定义为10,所以如果值增加程序停止执行,此外您还没有为代码设置处理错误机制。因此导致您提到的以下错误。使用fgets