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

関数内では、実際には文字列を null で終了しません。「文字列」に NUL 文字を含めることができない場合を除き、文字配列ではなく文字列として扱う方がよいでしょう。ただし、これは一般的なアドバイスであり、特定の問題とは関係ありません。

まず、 からのリターン コードfgetcint(not char)です EOF

次に、"\0"文字ではなく、文字列定数への文字ポインターです。NUL文字が必要な場合は、二重引用符ではなく単一引用符を使用する必要があります。

最後に、ループインmainして文字を出力します。これは<=which を使用して、必要な文字よりも 1 つ多い文字を取得します -<代わりに使用します。

于 2013-03-15T01:24:42.717 に答える
0

len == 0とすると、このループは何回実行されますか?それはあなたがゼロ文字for(i=0;i<=len;i++)を印刷する方法ですか?

charは?のすべての値を表すことができますunsigned charか?それはその能力を持っているかもしれません...それが可能であれば、それは負の値を表すこともできますEOFか?符号なしタイプであると仮定charして、の符号を考慮して(ch=fgetc(fp))ください。(unsigned char) EOF等しくなるだろEOFうか?fgetcはを返します。これは、すべての値と負の値を表すことができるintためです。(文字以外の)値と値を正しく区別できるように、明らかにである必要があります。intunsigned charEOFchintEOFunsigned char

于 2013-03-15T01:53:55.750 に答える
0

まず、i <= len を i < len に変更して、もう 1 文字カウントしないようにします。次に、hexdump プログラムを使用して、ファイルに余分な改行文字や最初の Unicode バイト オーダー マークがないかどうかを確認します。

于 2013-03-15T03:16:16.000 に答える