2011-12-29 93 views
3

我正在寫一個程序來讀取stdin並輸出它。程序輸出奇怪的字符,即使當字符串是零終止

int main() { 
    FILE* inputF = stdin; 
    char* inputStr[10]; 

    fread(inputStr, 1, 9, inputF); 
    if(ferror(inputF)) { 
     printf("An error occurred"); 
     return 0; 
    } 

    inputStr[9] = '\0'; 

    printf("%s", (const char*)inputStr); 

    return 0; 
} 

應該創建10個字符長的字符串,讀9個字節的標準輸入進去,然後在9位

'\0'當我運行該程序,這是結果:

[email protected]:~/work/c/fibo$ ./a.out < test.txt 
56                          `ô 
                             ga 

打印兩行和多餘字符(滾動到右側以查看它們)。

什麼可能導致這種情況?

+0

應該怎麼做,當我創建數組? – 2011-12-29 22:47:35

+0

@GabrieleCirulli對不起,誤讀。 (失敗) – 2011-12-29 22:48:53

回答

2

@DanielFischer指出立即解決問題,然而,一旦你已經解決了char[] VS char*[]問題,你也應該注意...

如果test.txt包含少於9個字符那麼你仍然有垃圾最後一個讀取字符與寫入空終止符的位置之間的字符。

您應該檢查fread的返回值,以查看在適當位置讀取了多少個字符並將空終止符寫入。

+0

謝謝,它現在似乎工作正常。作爲替代方法,在從stdin輸入之前,是否可以用'\ 0'填充字符串,以便將剩餘的字符設置爲'\ 0'? – 2011-12-29 22:57:40

+0

@GabrieleCirulli:是的,但是檢查返回值仍然是一個好主意。它也會告訴你電話是否失敗。 – 2011-12-29 22:58:51

+0

當然,'char inputStr [10] = {0};'做到了。 – 2011-12-29 22:58:58

9

inputStr不是字符串,

char* inputStr[10]; 

它是10 char *陣列。您應該將聲明更改爲char inputStr[10];

+0

謝謝。你可以請求解釋給我什麼時候應該使用'char *'嗎? – 2011-12-29 22:50:02

+0

實際上,即使在更改了inputStr的聲明之後,它看起來仍然會打印多餘的字符。 – 2011-12-29 22:52:19

+0

當你想有一個單一的字符串(或指向一個'char'的指針)。例如,您可以在代碼中使用'char * inputStr = malloc(10);'。那麼你應該'免費(inputStr);'當你不再使用它時。 – 2011-12-29 22:54:23

1
#include <stdio.h> 

int main(void) 
{ 
    FILE* inputF = stdin; 
    char inputStr[10]; 

    fread(inputStr, 1, 9, inputF); 

    inputStr[9] = '\0'; 
    printf("%s \n", inputStr); 

    return 0; 
} 

$ gcc run.c 
$ ./a.out 
123456789 
123456789 
$ 

您需要一條char a[]char *但不char *a[]

上面的代碼片斷是不完整的,因爲它沒有錯誤檢查,輸入驗證等

+0

我已經在正確的地方添加了null終止,正如上面的答案建議的那樣,是否還有其他步驟可以確保輸入有效? – 2011-12-29 23:05:44

+0

你應該輸入一個有效的字符..任何超過9將被忽略..你可以檢查'fread()'函數的返回值,以防萬一..除此之外,我想你不必擔心。如果您認爲上述代碼已回答問題,請通過單擊答案旁邊的刻度線來確認。謝謝:) – 2011-12-29 23:19:22