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 是输入并且不会改变(与使用 fscanffgets 从文件读取时不同)。

所以在那种情况下它只是一个无限循环。

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;
}