1

为什么以下代码可以正常工作:

#include<stdio.h>
int main()
{
     FILE *fp=fopen("input.txt","r+");
     char c;
     while((c=getc(fp))!=EOF)
     {
         printf("%c",c);
     }
     fclose(fp);
     return 0;
}

但此代码给出了错误“分段错误,核心转储”:

#include<stdio.h>
int main()
{
     FILE *fp=fopen("input.txt","r+");
     char c;
     while((c=fscanf(fp,"%c",&c))!=EOF)
     {
         printf("%c",c);
     }
     fclose(fp);
     return 0;
}

input.txt 包含一个空格分隔的字符列表,例如:abcdef

4

1 回答 1

3

这不会按您期望的方式工作:

while((c=fscanf(fp,"%c",&c))!=EOF)

getc()返回读取的字符,可以是EOF,但fscanf()返回分配的输入项的数量,或者EOF在任何转换发生之前是否存在失败。

您不能将此返回值分配给c,因为返回值不是读取的字符(稍后您尝试打印)。

你应该试试这个:

while(fscanf(fp,"%c",&c) == 1)

或者:

while(fscanf(fp,"%c",&c) != EOF)

这相当于说“只要有一个字符可以阅读......”

此外,在第一种情况下(您使用的代码getc()c应该是 int - 如果目标平台使用无符号字符,您可以有一个无限循环,因为c将始终转换为正整数(同样,仅在具有无符号字符的平台中),因此永远不会等于EOF。如果您查看getc()putc()(以及其他处理字符的函数)的联机帮助页,您会看到它们收到int的是 ,而不是char

于 2014-02-08T12:24:48.523 回答