2014-10-01 222 views
0

我編譯我的代碼,然後運行:$ ./a.exe < input.txt 由於某些原因,它不會讀取第一個字符(t從第一行中的測試中缺失) 並且還有一個奇怪的字符在最後。我如何對付這兩個錯誤? 感謝重定向標準輸入

#include <stdio.h> 
#include <stdlib.h> 

int main(void) {  
    char c = getchar();  
    while (c != EOF){ 
     printf("%c ",c); 
     c = getchar(); 
    } 
    return (0); 
}   

樣品執行:

$ ./a.exe < input.txt 
    e s t l i n e o n e 
t e s t l i n e t w o 
f i n a l l i n e ▒ 
+0

2all回答人:請停止在您的代碼段中使用「char c」。所有與char相關的函數都會返回整數,而不是字符,EOF也是如此。 int c - 正確,char c - 錯誤。 – user3125367 2014-10-01 02:52:30

回答

3

首先,請注意,當您首次執行while時,c是未分配的。

然後,請注意,當讀取倒數第二個字符時,您的while測試會通過,導致讀取和打印另一個字符 - 因此您將EOF的視覺表示看作最後一個字符。

如果您正在將一個文件傳送到此程序中,我懷疑在寫入的行之前發生了什麼,導致T被省略。

#include <stdio.h> 
    #include <stdlib.h> 

    int main(void) {  
     int c = getchar();  
     while (c != EOF){ 
      printf("%c ",c); 
      c = getchar(); 
     } 
     return (0); 
    } 

編輯:

你可以通過執行類似避免了其他的問題我也建議我們按照user3125367的建議在上面的評論,從而消除了從int到字符一些偷偷摸摸的鑄造。我上面編輯過使用int。這也可以讓你使用%n來查看文件中第一個字符的實際值,和/或它可以解決問題(即文件中的第一個字符可能看起來像T,但是一個值大於255的非ASCII字符。)

+0

這是一個很好的例子,其中do-while構造可以更有用,更容易閱讀而不僅僅是一段時間。 – millinon 2014-10-01 02:49:17

+0

您的解決方案將EOF顯示在最後,但第一個字符仍然被省略。 http://gyazo.com/a66ebc666b56cbc381b6ff4bea8408bf – ImBadAtProgramming 2014-10-01 02:52:18

+0

編輯問題向我們展示代碼前顯示的代碼。我認爲它必須在那之前發生。 – Dronz 2014-10-01 02:53:24

-2

不知道第一個錯誤是如何發生的,但是這應該可以解決第二個:

int c; 
for (c = getchar(); c != EOF; c = getchar()) { 
    printf("%c ",c);   
} 

仔細檢查,以確保您的文件實際上包含您缺少的第一個字符。

原因你getchar讀取字符時使用int是因爲EOF常量是一個整數,它是not guaranteed代表一個有效的字符值。因此,當您將角色與EOF進行比較時,即使遇到EOF,與實際EOF常數相比,它也不會評估爲真。

您還會注意到,這些功能您使用諸如getcharputchar等,都接受和返回int不是char(我知道,混淆吧?)。我相信這個決定主要是爲了在不犧牲珍貴字節的情況下添加對EOF的支持。

+0

http://gyazo.com/15a2e749bc2d0949e20d14583d0ad0ec,你爲什麼要解決這個問題? – ImBadAtProgramming 2014-10-01 02:42:55

+0

@ImBadAtProgramming c!= EOF; for語句的一部分會阻止EOF打印。 – Dronz 2014-10-01 02:52:16

0

我沒有看到任何關於重定向stdin的顯着內容。它看起來像你的文本文件有效地具有ASCII字符(是嗎 - 沒有奇怪的符號?)。該文件可以編碼爲UTF-8(每個字符最多4個字節)或另一個多字節系統。對於UTF-8,保留ASCII字符的值,即全部小於128,因此它們可以轉換爲帶符號的字符而不會降低精度。一般來說,UTF-8中的字符最多可以有4個字節的大小,因此要求至少存儲int的大小。 你的代碼有點尷尬,但我沒有馬上看到它爲什麼不應該工作,除非char類型是問題。但是,我嘗試了int和char,並得到了相同的結果(它工作正常)。這裏是我的代碼(char類型註釋掉):

#include <stdio.h> 
int main() 
{//char c; // Wrong. getchar returns int. 
    int c; 
    while ((c = getchar()) != EOF) printf("%c", c); 
    return 0; 
} 

輸出對於任何字符都是一樣的;或者int c;如下:

Test line 1 
Test line 2 
Last Line, no CR 

編輯:交流空間表明您input.txt的文件必須被編碼爲UCS-2(兩分字節的Unicode),或類似的東西;由於文本字符值都小於127,因此每個其他字節都爲零。因爲它們是「不可打印的」,所以零打印爲空格。我在這裏猜測(沒有時間檢查)第一條輸出線上的前導空間是由於兩個字節的BOM(字節順序標記)導致的,可能是FF FE或FE FF,它們很可能是無法打印。將輸入文件保存爲UTF-8或ANSI,然後重試。

+0

您是否在發佈原始問題後編輯了您的編碼?另外,你是否在input.txt中輸入了交替空格,或者它們是代碼的人工產物? – riderBill 2014-10-01 14:09:35

+0

這是C或C++代碼嗎?什麼OS?使用標籤。 – riderBill 2014-10-01 14:11:20