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

问题描述 投票:1回答:3

我在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]);

c scanf warnings
3个回答
2
投票

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

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

所以您应该做类似的事情:

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

例如,如果从文件中获取的name的长度大于100,则此函数将溢出。问题也类似于scanf


2
投票

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

您可以通过简单地增加字段宽度的限制来解决它,如下所示:

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

1234的值已被补偿。上面的代码最多读取1234个字节。


2
投票

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

char name[50];

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

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

© www.soinside.com 2019 - 2024. All rights reserved.