0

我需要从文件中读取文本并将其传递回主函数,并且在 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;
}

这个实现是正确的吗?

4

3 回答 3

1

在您的函数中,您实际上并没有以空值终止字符串。除非您的“字符串”能够包含 NUL 字符,否则最好将其视为字符串而不是字符数组。但是,这只是一般建议,与您的具体问题无关。

首先, from 的返回码fgetcint(not char),因为它必须能够表示每个字符plus EOF

其次,"\0"不是字符,它是指向字符串常量的字符指针。如果你想要 NUL字符,你应该使用单引号,而不是双引号。

最后,你的循环main打印出字符:它使用<=which 会给你比你想要的多一个字符 -<改为使用。

于 2013-03-15T01:24:42.717 回答
0

假设 len == 0,这个循环会运行多少次?for(i=0;i<=len;i++)这就是你打印零个字符的方式吗?

a 可以char代表 a 的所有值unsigned char吗?它可能具有这种能力......如果可以,它是否也代表负值EOF?假设char是无符号类型,考虑 的有符号性(ch=fgetc(fp))。永远(unsigned char) EOF平等EOF吗?fgetc 返回int,它这样做是因为它int可以表示每个unsigned char值以及负值EOFch显然应该是int,因此您可以正确区分EOF(非字符)和unsigned char值。

于 2013-03-15T01:53:55.750 回答
0

首先,将 i <= len 更改为 i < len,这样它就不会再计算 1 个字符。其次,使用 hexdump 程序检查您的文件是否没有额外的换行符或初始 unicode 字节顺序标记。

于 2013-03-15T03:16:16.000 回答