2014-10-18 178 views
1

這是一個從文件中逐個字符讀取的函數,然後將該字符串轉換爲float,但while循環在讀取'/ 0'時不會終止。while循環不以' 0'結尾

GSF555 「氣體過濾器 - 福特護航」 64.50 9 < - 這就是中但 「64.50」

PKL070讀 「公園鏡頭 - 豐田卡羅拉」 36.50 8

while循環進入超過'/ 0'並且還讀取下一行數據中的「9」和字符。

我只是有printf看看有什麼問題。

float getPrice(FILE * in){ 
    char ch; 
    int i = 0; 
    char str[10]; 
    ch = fgetc(in); 
    printf("INDEX + NUMBER = %d %c\n", i, ch); 
    if(ch == '\0') 
     ch = fgetc(in); 
    str[i++] = ch; 
    while(ch != '\0' && i < 10){ 
     str[i++] = ch; 
     printf("Index I = %d\n", i); 
     ch = fgetc(in); 
     printf("3 %c\n",ch); 
    } 
    printf("STRING = %s\n", str); 
    return atof(str); 
} 
+0

'str'不一定是null字符在打印前終止。 – chux 2014-10-18 02:20:06

回答

2

我不確定我在您的帖子中看到的\ 0您所指的是,但我可以看到一些問題。

首先,fgetc返回一個整數,而不是一個字符。這對於測試文件結束可能很重要,因爲EOF是一個值爲-1的整數,而不是通常取值爲0-255的字符。您可以將ch的聲明更改爲int,而不是char。 (不要擔心,這不會影響%c的ch打印。)

此外,如果您嘗試通過\ 0測試來檢測行結束,它可能不起作用。行尾是換行符,\ n。根據底層操作系統,這可能需要兩個字符,而不是一個。你應該能夠比較ch如果聲明爲一個int換行符,但它可能無法正常工作,如果你將ch保留爲char,如果這是你正在嘗試做的。

+0

我沒有閱讀,直到行結束,因爲我上面說過,它將從「6」開始,並假設以「0」結束,並在該函數結束時給出「6.50」。 – PinC 2014-10-18 01:01:47

+0

@hinkatana'0'和'\ 0'並不完全相同。 – 2014-10-18 05:20:27

+0

我認爲ch!='0'的intead可以在while條件中使用isdigit(ch)。當空間被讀取時,這將停止循環。您需要在程序頂部添加#包括。 – Edward 2014-10-19 23:44:44

1

當讀取'/ 0'時while循環沒有終止。

沒有'/ 0'(禁止多字節字符,對於書呆子),'\ 0'是NUL而'0'是零數字。所以用'0'替換程序中的'\ 0'。雖然尋找'0'是奇怪的;查找分隔符更常見,比如數字後面的空格(或任何其他非數字)。

+0

首先,我不能保證一個項目的價格將以'0'結尾,假設它具有'999.99',那麼爲什麼我會以'0'結束我想要這個數字。 – PinC 2014-10-19 13:41:02

+0

@hinkatana你**寫過**'假設以'0'結尾,所以我把你的意思是你想要尋找'0'; *正如我在答覆中所寫的那樣,這是一件很奇怪的事情。我不知道你爲什麼要尋找'\ 0',因爲在輸入中沒有一個,在數字之後或其他地方。 *正如我在答案中寫的那樣,你應該尋找數字後面的空格。 – 2014-10-19 13:47:42