我需要从文件中读取文本并将其传递回主函数,并且在EOF之后我总是得到3个字符,为什么会发生这种情况?
#include<stdio.h>
#include<string.h>
int activenw(char *);
void main()
{
char act_con[50];
int len,i;
len=activenw(act_con);
for(i=0;i<=len;i++)
{
printf("%c",act_con[i]);
}
}
int activenw(char *buff)
{
char ch="\0";
FILE *fp;
int i=0;
fp=fopen("abc.txt","r");
if(fp==NULL)
{
printf("Error opening a file :");
exit(0);
}
while((ch=fgetc(fp))!=EOF)
{
printf("%c",ch);
*buff=ch;
buff++;
i++;
}
fclose(fp);
return i;
}
这个实现是否正确?
答案 0 :(得分:1)
在你的函数中,你实际上并没有空字符串终止。除非你的“字符串”能够包含NUL字符,否则最好不要将视为字符串而不是字符数组。但是,这只是一般性建议,与您的具体问题无关。
首先,fgetc
的返回代码是int
(不是char
),因为它必须能够代表每个字符 plus {{1} }。
其次,EOF
不是字符,它是字符串指针到字符串常量。如果你想要NUL 字符,你应该使用单引号,而不是双引号。
最后,您在"\0"
的循环中打印出字符:它使用的main
会给您一个比您想要的更多的字符 - 请改用<=
。
答案 1 :(得分:0)
假设len == 0,这个循环会运行多少次? for(i=0;i<=len;i++)
这是打印零字符的方式吗?
char
可以代表unsigned char
的所有值吗?它可能具有这种能力......如果可以,它是否也能代表负值EOF
?假设char
是无符号类型,请考虑(ch=fgetc(fp))
的签名。 (unsigned char) EOF
是否会等于EOF
? fgetc返回int
,这样做是因为int
可以代表每个unsigned char
值,以及负EOF
值。 ch
显然应为int
,因此您可以正确区分EOF
(非字符)和unsigned char
值。
答案 2 :(得分:0)
首先,将i&lt; = len改为i&lt; len使它不再计算1个字符。其次,使用hexdump程序检查您的文件是否没有额外的新行字符或初始unicode字节顺序标记。