void loop(char * a){
for(int i=0;i<10;i++){
printf("%s\n", a);
}
}
int main(){
char str[] = "";
printf("input:");
scanf("%[^\n]s", str);
loop(str);
return 0;
}
当我输入短字符串时没有任何问题, 但问题是当我输入更长的字符串时。
例如
输入:abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
abcdefghijkl
输入:
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
abcdefghijklm
退出,分段错误
为什么会出现这个错误? 这与缓冲区溢出有关吗?
答案 0 :(得分:2)
您通过写入超出范围的 1 元素数组 str
调用了未定义行为,允许任何事情发生。
分配足够的缓冲区并限制读取的最大长度以避免缓冲区溢出。
int main(){
char str[102400] = ""; /* allocate enough size */
printf("input:");
scanf("%102399[^\n]s", str); /* limit the length to read (the size of buffer minus one for terminating null-charater) */
return 0;
}
答案 1 :(得分:2)
您定义 str
的方式:
char str[] = "";
它正好足以包含一个长度为零的字符串,即它是一个长度为 1 的数组。因此,您尝试写入的任何更大的字符串都会溢出缓冲区,从而触发 undefined behavior。
你应该给你的缓冲区一个足够大的大小来接受你期望的字符串大小。
char str[100];
并更新 scanf
调用以限制字符数:
scanf("%99[^\n]s", str);