0
#include <stdio.h>

int main () {

    FILE *fp;
    char ch;
    char data[100];
    int i;

    fp = fopen("file.txt","r");

    i=0;

    while( (ch=fgetc(fp)) != EOF) {
            data[i]=ch;
            i++;
    }

    i=0;

    while(data[i]) {
            printf("%c",data[i]); 
            i++;
    }

 return 0;

 }

file.txt の内容:

udit@udit-Dabba /opt/lampp/htdocs $ cat file.txt 
aGVsbG9teW5hbWVpc2toYW4K

プログラムの出力:

udit@udit-Dabba /opt/lampp/htdocs $ sudo vim test.c
udit@udit-Dabba /opt/lampp/htdocs $ sudo gcc test.c
udit@udit-Dabba /opt/lampp/htdocs $ ./a.out
aGVsbG9teW5hbWVpc2toYW4K
P�udit@udit-Dabba /opt/lampp/htdocs $ 

配列の出力にこれら 2 つの余分な文字が表示されるのはなぜですか...??? 入力ファイルは、実際には base-64 エンコーディングの結果です。

4

4 に答える 4

1

最初のループは で終了しますがEOF、これは配列に書き込みませんdata(できないため)。

2 番目のループは、配列'\0'のどこにもない a で終了します。data

'\0'を読んだら、終端を追加することをお勧めしますEOF

于 2011-09-30T15:24:25.833 に答える
1

fgetcintはnot a を返しますchar

これがうまくいくかどうかを確認してください:

#include <stdio.h>

int main (void) {

    FILE *fp;
    int ch;
    int data[100] = { 0 }; // Easiest way of initializing the entire array to 0
    int i;

    fp = fopen("file.txt","r");

    i=0;

    while( (ch=fgetc(fp)) != EOF) {
            data[i]=ch;
            i++;
    }

//        data[i]=0; -->You did not provide a terminating point - 
// Not needed if the array is initialized the way i did.

    i=0;

    while(data[i]) {
           printf("%c",data[i]); 
            i++;  }
 return 0;

 }
于 2011-09-30T15:25:08.467 に答える
1

data[] 配列を終了していません-入力の最後にゼロを置くものは何もないため、それを書き出すと、たまたまデータの最後に余分な(ランダムな)値を出力し続けますゼロを打ち、

c では、データは何にも初期化されないことに注意してください。

于 2011-09-30T15:23:04.020 に答える
1

開始する前にデータをゼロに設定しなかったためのようです。追加してみる

memset(data,0,sizeof(data)); 

読む前に。余分な出力は、使用を開始する前にその場所のメモリにたまたまあったものです。

于 2011-09-30T15:23:43.287 に答える