我在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。字符串终止符必须保留一个字符。)>