没有字段宽度限制的 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。字符串终止符必须保留一个字符)。
我有一个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。字符串终止符必须保留一个字符)。