从fgets()的返回值赋值

时间:2017-03-04 16:27:14

标签: c pointers fgets

据我所知,fgets()返回输入的字符串参数,但是

我收到“错误:从类型'char *'”分配类型'char [101]'时出现不兼容的类型,

那么,为什么变量'line'被认为是'char [101]'类型而不是'char *'类型?

char line[101] = "";

while (feof(filePtr) == 0){
    line = fgets(line, 101, filePtr);
    strcpy(strPtr, line);
}

2 个答案:

答案 0 :(得分:5)

长话短说:你不能分配给一个数组,它不是一个可修改的左值。您需要定义另一个指针来保存返回值。

  

为什么变量line被视为类型char[101]而不是char *

在您的情况下,line并非被视为属于char [101]类型,确实In some of the cases,数组向下衰减到指向数组中第一个元素的指针,但这并没有改变数组变量本身是数组类型的事实。

那就是说,你过度了。您不需要 来存储返回值。您只需针对NULL进行检查即可完成。 fgets()无论如何都会将扫描值存储在line数组中。这就是首先传递line(和它的大小)的重点。

如上所述,请参阅Why is “while ( !feof (file) )” always wrong?

答案 1 :(得分:4)

这里有两点需要澄清:

  • 您无需在数组指针中获取fgets()调用的结果。 fgets()的第一个参数是用于存储读取值的数组。您可以创建任何临时char指针并将fgets()的结果输入其中。如果该值为null,则此指针仅用于检测fgets()错误。

  • c中的数组名称不能分配任何值。由于它在某些情况下被视为指向数组第一个元素的指针,因此可能会被误解。此外,当编译器在编译时知道数组的大小时,它会使用此信息。如果您使用sizeof(line),则输出将是101而不是4,这应该是32位计算机中的sizeof(any pointer)或64位计算机中的8位。