gpt4 book ai didi

c - getc 和 fscanf 之间的区别

转载 作者:太空宇宙 更新时间:2023-11-04 02:05:05 25 4
gpt4 key购买 nike

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

#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;
}

但是这段代码给出了一个错误'segmentation fault, core dumped':

#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 包含一个以空格分隔的字符列表,例如:a b c d e f

最佳答案

这不会像您期望的那样工作:

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 - 如果目标平台使用,您可以有一个无限循环unsigned chars,因为 c 将始终转换为正整数(同样,仅在具有 unsigned chars 的平台中),因此永远不会等于 EOF。如果您查看 getc()putc()(以及其他处理字符的函数)的联机帮助页,您会看到它们接收到 int,而不是 char

关于c - getc 和 fscanf 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21645857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com