2012-10-04 153 views
1

我需要從C中讀取文件,將其存儲在數組中並打印其內容。出於某種原因,我在結尾處看到八進制輸出。我在計算打開文件後計算其中有多少行和字符後,動態創建數組。將C數組打印到終端

輸出:

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; 
} 
+0

代碼更新爲空間和製表符。 –

回答

8

更改閱讀程序:

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

,並添加 「\ n」 早在printf的程序。

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

C字符串是零結尾,而不是「\ n」封端的,所以當你的printf()的他們,printf()不知道在哪裏停止打印。

+0

對不起,我爲什麼0x0(十六進制),而不僅僅是0?在字[i] [j] = 0x0; –

+0

哦,那只是一種習慣。甚至不是我最糟糕的一個:-) - 我用它來一眼識別字符。但它完全等價於'= 0'。其實我會喜歡寫'if('\ n'== c)',這就是我通常所做的。 – LSerni

+0

Ahh('\ n'== c)crazy :)非常感謝,緩慢但肯定C正在沉入。 –

5

您還沒有終止的字符串。您需要在每行的最後一個字符後添加空終止符:\0

在你的第一個循環中,你爲最長的行確定了足夠的空間,包括換行符。

  • 如果你想保持換行符在你輸入數組,只需添加1〜max_char_per_line,和換行字符後添加空終止符,當你完成你的第二個循環的每一行。

  • 如果你不需要需要輸入數組中的換行符,而不是簡單地使用該空格作爲空終止符。

0

這並不是說明了你觀察到的現象,但它可能。計算數組邊界時,您似乎沒有考慮終止零字節。完成計算後,只需要++ max_char_per_line。如果數組不能保證零初始化,請不要忘記添加這個零字節。

編輯:你看到這些行的輸出還是在這一行輸出?