2013-07-19 55 views
9

我剛開始學習編程(C)作爲一種愛好,我自己。我用k & R.(練習1.6 K&R)如何確定getchar()!= EOF是0還是1?

main() 
{ 
int c; 
while ((c = getchar()) != EOF) 
putchar(c); 
} 

驗證的getchar()= EOF爲0或1

我想我明白髮生了什麼事!

  1. c被分配了鍵盤的下一個字符
  2. 檢查c是否是EOF
  3. c被分配1或0,這取決於它是否是EOF。
  4. 字符顯示在輸出上,或者EOF結束程序。

然而,我的解決方法是錯誤的,那麼顯然我不理解的東西:

main() 
{ 
    int c; 

    while ((c = getchar()) != EOF) 
     printf("%d\n", c); 
} 

這只是打印字符的值。如果按回車鍵,也會打印「10」。

我以爲它會打印c。但是,它將打印字符的值而不是1或0值。

我知道c與EOF比較後被賦予1或0。但我不確定我可以用什麼邏輯來展示這一點。看起來我需要以某種方式「擺脫」顯示字符值,而是顯示比較值。這是否意味着我需要擺脫while循環?如果是這樣,我不知道如何(這只是一個猜測)。

如何簡單驗證c = 1或0?

而且,我應該怎麼知道呢?我想我應該從中學到一些基本的東西。

main() 
{ 
    int c; 

    while ((c = getchar()) != EOF != 0 != 1) 
     putchar(c); 
} 

我也做了這個,我覺得這似乎工作。由於它不輸出任何字符,但我不確定這是否是他們正在尋找的解決方案...

+0

'X!= y'返回boolean值。你可以通過閱讀C標準來驗證它總是「1」還是「0」(並且假設你的編譯器實際上遵循了它,我想)。(雖然你問另一個與c無關的問題,由'getchar'返回,而不是與EOF比較的值)。 – geoffspear

回答

10

我知道c的比較後分配1或0它與EOF

不,它不是。看:

while ((c = getchar()) != EOF) 

的表達式爲:(c = getchar()) != EOF,其containts另一種表達:(c = getchar()),其中分配給c從鍵盤的字符。 c將不會等於0或1!這是表達式的結果。試試這個代碼:

int main() 
{ 
    char value; 
    int c; 
    value = ((c = getchar()) != EOF); 
    printf("%i\n", value); 
    return 0; 
} 

此代碼將打印表達式(c = getchar()) != EOF的值。其實,你的代碼可以這樣寫:

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

表達不在while了其結果被分配到value。上面的代碼和您的代碼將生成完全相同的輸出。


編輯:

`main() 
{ 
    int c; 

    while ((c = getchar()) != EOF != 0 != 1) 
     putchar(c); 
}` 

這不是解決方案!這裏是重寫的代碼:

`main() 
{ 
    int c; 
    char value1; 
    char value2; 
    char value3; 

    value1 = ((c = getchar()) != EOF); 
    value2 = value1 != 0; 
    value3 = value2 != 1; 
    while (value3) 
    { 
     putchar(c); 
     value1 = ((c = getchar()) != EOF); 
     value2 = value1 != 0; 
     value3 = value2 != 1; 
    } 
}` 

那麼會發生什麼? 假設getchar將返回字符'A'。所以value1將等於1,因爲'A'不同於EOFvalue2將等於1,因爲value1(其等於1)大於0。value3將等於0不同,因爲value2(其等於1)爲不同於1:while(value3)現在是while(0),所以不會打印字符。

理解您可以將一個比較表達式的結果(即至少包含一個比較運算符的表達式)分配給一個變量並且此類表達式的結果爲0(對於false)或1 (爲真)。


對OP的評論幾句:

嘿,謝謝。但是K & R明確表示「這具有將c設置爲1或0的不良影響」。也許這就是我困惑的原因。

c將被分配爲0或1,如果while看起來像這樣:

while (c = getchar() != EOF) 

操作!=具有比操作者=更大的優先級。這意味着getchar() != EOF將首先被評估,然後其結果將被分配到c

+0

嘿,謝謝。但K&R明確指出:「這具有將c設置爲1或0的不良影響」。 也許這就是爲什麼我很困惑。 – BBedit

+0

@ user2071506我編輯了我的答案。 – nouney

+0

我開始覺得編程不適合我。即使這些簡單的概念也很難理解。 感謝您的解釋! – BBedit

3

'c'被分配了來自getchar的值,然後檢查它是否是EOF 。

如果未分配EOF,則輸出'c'的值;如果沒有,存在循環。

的測試EOF沒有任何價值重新分配到「C」,它只是成功或失敗

督察,免除您的步驟3

1

這裏c未分配給比較結果。它包含value read form File.

要檢查的比較,你需要如下

INT結果的結果=((C =的getchar())!= EOF)

然後用結果來檢查它是0或1.

printf("%d",result); 
5

我意識到問題是舊的,但選定的答案是回答一些事情,而不是問題的目的是要問。 (這是本書提出的一個不同的問題)我在這裏澄清一些事情,並希望其他從Google搜索此問題的人可以閱讀我的答案,以便更好地理解第2版C語言中的問題1-6版。

問題表示驗證的getchar()!= EOF爲0或1

書中暗示,

**c = (getchar() != EOF)**

相當於

**c = getchar() != EOF**

getchar() != EOF被測試時,

如果輸入的是EOF,那麼它應該是真實的,因此返回True,或在這個意義上1

當然並且,如果輸入EOF,然後getchar() != EOF將返回一個False,或0

這就是爲什麼10將被分配到c

對於書中提到的「不期望的效應」,因爲無論1也不0是原始輸入,這意味着原始字符旨在是輸出是丟失,這是不希望的。

進行演練,使用此:

#include <stdio.h> 

main() 
{ 
    int c; 
    while (c = getchar() != EOF) { 
     printf("%d\n", c); 
    } 
} 

如果輸入不EOF,那麼它將打印1

如果你的輸入是EOF,那麼程序結束。

注:要在Windows中鍵入EOF,使用按Ctrl + Z

編輯:

一個簡單的辦法,以練習ķ& R. 1.6

printf("%d", getchar() != EOF); 
+0

只是用Google搜索了這個問題。感謝:) – vasili111

0

我對這個問題有很多麻煩。

而且如果按回車鍵,也會打印「10」。

另外,第20頁K & R表示'\ n'的ASCII值是10.所以也許你是無意中返回那個值?

每當我回到它時,我忘記回車鍵不是 EOF。

與上面Sayyora指出的一樣,您需要一個組合鍵來指示EOF。

對於Linux,它是:

按Ctrl + d

此外,殺程序(在X-期限至少),它是:

Ctrl + C鍵

0

我在DevC++ 4.9.9.2中使用C源文件。我是C編程新手,我正在使用K/R 2nd Ed。作爲我的指導。在回顧上面的陳述後,我發現以下幾行爲我提供了示例1.6/1.7所需的輸出。請隨時糾正我的理解,但通過閱讀作者的提示,瞭解使用括號並在while循環內部和外部打印時,可以獲得1或0的結果。最後一個getchar()是Dev-C環境要求打開輸入/輸出屏幕以審查打印的語句。

main() 
{ 
     int c; 
     while (c=getchar() !=EOF) 
      printf("%d",c); 
     printf("%d",c); 
     getchar();  
0
// it will accept and print a single char, a word, a sentence... 

while (c != EOF) { 
    printf("\ngetchar()) != EOF) = %d -- ", ((c=getchar()) != EOF)); 
    putchar(c); 
} 

//the trick is to only call getchar() once per char and EOF value 
//note: the last char is always char(10) which is invisible 
+2

你正在爲一個公認的新手程序員提出一個解決方案。這應該伴隨着一個理想的詳細解釋。 – sorak

+0

調用getchar(c)會消耗一個字符。那麼如何打印每個getchar(c)並且打印同一個getchar(c)調用的EOF值呢?一種方法是在printf()函數本身中調用getchar(c)。這允許您在打印生成的字符和EOF時爲輸入的每個字符調用一次getchar()。 while語句中的子句允許這樣做,但它不是很優雅。我不確定C的後續版本是否允許這樣做,但是ANSI C會這樣做。用ANSI編譯使用-ansi標誌。 – tedro

+0

剛剛意識到getchar()中的最後一個字符是char(10),所以它是不可見的,但是putchar(c)將它視爲任何其他字符 – tedro