1

C からファイルを読み込み、それを配列に格納して、その内容を出力する必要があります。何らかの理由で、最後近くの出力に 8 進数が表示され続けます。ファイルを開いた後、その中に含まれる行数と文字数を数えた後、配列を動的に作成しています。

出力:

Abies 
abies 
abietate 
abietene 
abietic 
abietin
\320ѿ_\377Abietineae --> umlaut? where did he come from?
y\300_\377abietineous

コード:

int main(int argc, char ** argv) {

char c = '\0';
FILE * file;
int i = 0, j = 0, max_line = 0, max_char_per_line = 0;

/* get array limits */
file = fopen(argv[1], "r");
while ((c = fgetc(file)) != EOF){
    if (c == '\n'){
        max_line++; j++;
        if (j > max_char_per_line){
            max_char_per_line = j;
        }
        j = 0;
        continue;
    }
    j++;
}

rewind(file);
/* declare array dynamically based on max line and max char */
char word[max_line][max_char_per_line];

/*read in file*/
j = 0; c = '\0';

while ((c = fgetc(file)) != EOF){
    if (c == '\n'){
        word[i][j] = '\0';
        i++; j=0;
        continue;
    }

    word[i][j] = c;
    j++;
}
word[i][j] = '\0';

fclose(file);
for (i = 0; i < max_line; i++){
    printf("%s\n", word[i]);
}



    return 0;
}
4

3 に答える 3

8

読み取りルーチンの変更:

   if (c == '\n'){
        word[i][j] = 0x0;
        i++; j=0;
        continue;
    }

printf ルーチンに "\n" を追加します。

for (i = 0; i < max_line; i++){
    printf("%s\n", word[i]);
}

C 文字列は "\n" で終了するのではなく、ゼロで終了するため、それらを printf() したときに、printf()印刷を停止する場所がわかりませんでした。

于 2012-10-04T17:29:40.430 に答える
5

文字列を終了していません。\0各行の最後の文字の後にnull-terminator: を追加する必要があります。

最初のループでは、改行文字を含む最長の行に十分なスペースを決定します。

  • 入力配列に改行を保持する場合は、 に 1 をmax_char_per_line追加し、2 番目のループの各行を終了するときに、改行文字の後にヌル ターミネータを追加します。

  • 入力配列に改行が必要ない場合は、代わりにそのスペースを null ターミネータに使用します。

于 2012-10-04T17:28:50.140 に答える
0

あなたが観察した現象を正確に説明しているわけではありませんが、そうかもしれません。配列の境界を計算するときに、終端のゼロバイトを考慮していないようです。++計算を行った後の max_char_per_lineだけです。また、配列がゼロで初期化されることが保証されていない場合は、このゼロ バイトを追加することを忘れないでください。

edit : これらの行は、出力のに表示されますか、それとも出力のこれらの行の 1 つに表示されますか?

于 2012-10-04T17:33:12.127 に答える