我需要从文件中读取文本并将其传递回主函数,我在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=" ";
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;
}
这个实现是正确的吗?
在函数中,实际上并没有以空终止字符串。除非您的"字符串"能够包含NUL字符,否则最好将其视为字符串而不是字符数组。然而,这只是一般的建议,与你的具体问题无关。
首先,fgetc
的返回代码是int
(而不是char
),因为它必须能够表示每个字符加上 EOF
。其次," "
不是一个字符,它是一个字符指针指向字符串常量。如果你想使用NUL 字符,应该使用单引号,而不是双引号。
最后,在main
中循环打印字符:它使用<=
,这会给你比你想要的多一个字符-使用<
代替。
假设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
值。
首先,将i <= len改为i <这样就不会再多算一个字符了。其次,使用hexdump程序检查文件是否有额外的新行字符或初始unicode字节顺序标记。>