没有字段宽度限制的 fscanf() 可能会因 C 中的大量输入数据而崩溃

fscanf() without field width limits can crash with huge input data in C

我有一个C语言练习,我写了一个函数

int readArray(FILE *wp, char *name, int n, double M[n][n])
{
    fscanf(wp, "%s", &name[0]);
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            fscanf(wp, "%lf", &M[i][j]);
    return 1;
}

我该如何更改?我有以下警告

warning: fscanf() without field width limits can crash with huge input data. [invalidscanf]
    fscanf(wp, "%s", &name[0]);

%s 占位符用于将单词读入字符串。

默认情况下,该词的长度没有限制。字段宽度说明符可以与 %s 占位符一起使用,以限制将写入缓冲区的字节数。

所以你应该这样做:

char name[100];
fscanf(wp, "%99s", name);

比如你从文件中得到的name的长度大于100,这个函数就会溢出。问题也和scanf类似。

这不是错误。这是一个警告。

你只需在字段宽度上添加一个限制就可以解决这个问题,就像这样:

fscanf(wp, "%1234s", &name[0])

价值1234刚刚补上。上面的代码将最多读取 1234 个字节。

该消息警告您 fscanf 无法控制输入大小,从而可能写入超出目标缓冲区大小的数据。为了解决它,只需将长度应用到 %s 格式:

char name[50];

fscanf(wp, "%49s", &name[0]);

这确保最多 49 个字符存储到名称数组中(在我的示例中,它的大小为 50。字符串终止符必须保留一个字符)。