sscanf 循环分段错误
sscanf cycle segmentation fault
我已经有几年没有编程了,我有一个问题 sscanf
:
我想使用 sscanf
将一个字符串分成几个,但是 sscanf
给我一个循环中的分段错误。这是为什么?如何在循环中使用 sscanf
而不会发生?
示例:
int main() {
char str[100];
char mat[100][100]; int i = 0;
strcpy(str, "higuys\niloveWhosebug\n2234\nhaha");
while (sscanf(str, "%s", mat[i]) == 1) i++;
}
int sscanf(const char *str, const char *format, ...);
while(sscanf(str,"%s", mat[i]) == 1) i++;
因为 str
在原型中是常量,它 不能 被 sscanf
改变(除非 sscanf
非常 broken :)), 所以它一遍又一遍地成功重复,一直返回 1 ...
因此 i
增加,并且在某个时候您达到了内存边界并且系统停止了您的有害程序。
如果您想读取多行字符串,请使用带有 strtok
的循环,这将遍历您的字符串并生成行。
注意:我之前的回答正确地假设之前的版本问题有错字,中间多了一个;
while(sscanf(str,"%s", mat[i]) == 1); i++;
总是成功的,因为 str
是输入并且不会改变(与使用 fscanf
或 fgets
从文件读取时不同)。
所以在那种情况下它只是一个无限循环。
sscanf
停在\n
,将单词higuys
存入数组mat[i]
和returns1
。循环条件为真,i
递增并且该过程继续 mat
的下一个元素作为具有相同源字符串的目标... mat
的每个元素接收相同的higuys
字符串,循环继续,导致缓冲区溢出,调用未定义的行为并最终崩溃。
以下是修改代码以使其工作的方法:
#include <stdio.h>
int main(void) {
const char *str = "higuys\niloveWhosebug\n2234\nhaha";
char mat[100][100];
int i = 0, n = 0;
/* parse the multiline string */
while (sscanf(str, "%s%n", mat[i], &n) == 1) {
str += n;
i++;
}
/* output the array */
for (int j = 0; j < i; j++) {
printf("mat[%d] = %s\n", j, mat[j]);
}
return 0;
}
我已经有几年没有编程了,我有一个问题 sscanf
:
我想使用 sscanf
将一个字符串分成几个,但是 sscanf
给我一个循环中的分段错误。这是为什么?如何在循环中使用 sscanf
而不会发生?
示例:
int main() {
char str[100];
char mat[100][100]; int i = 0;
strcpy(str, "higuys\niloveWhosebug\n2234\nhaha");
while (sscanf(str, "%s", mat[i]) == 1) i++;
}
int sscanf(const char *str, const char *format, ...);
while(sscanf(str,"%s", mat[i]) == 1) i++;
因为 str
在原型中是常量,它 不能 被 sscanf
改变(除非 sscanf
非常 broken :)), 所以它一遍又一遍地成功重复,一直返回 1 ...
因此 i
增加,并且在某个时候您达到了内存边界并且系统停止了您的有害程序。
如果您想读取多行字符串,请使用带有 strtok
的循环,这将遍历您的字符串并生成行。
注意:我之前的回答正确地假设之前的版本问题有错字,中间多了一个;
while(sscanf(str,"%s", mat[i]) == 1); i++;
总是成功的,因为 str
是输入并且不会改变(与使用 fscanf
或 fgets
从文件读取时不同)。
所以在那种情况下它只是一个无限循环。
sscanf
停在\n
,将单词higuys
存入数组mat[i]
和returns1
。循环条件为真,i
递增并且该过程继续 mat
的下一个元素作为具有相同源字符串的目标... mat
的每个元素接收相同的higuys
字符串,循环继续,导致缓冲区溢出,调用未定义的行为并最终崩溃。
以下是修改代码以使其工作的方法:
#include <stdio.h>
int main(void) {
const char *str = "higuys\niloveWhosebug\n2234\nhaha";
char mat[100][100];
int i = 0, n = 0;
/* parse the multiline string */
while (sscanf(str, "%s%n", mat[i], &n) == 1) {
str += n;
i++;
}
/* output the array */
for (int j = 0; j < i; j++) {
printf("mat[%d] = %s\n", j, mat[j]);
}
return 0;
}