2016-05-08 74 views
2

下面是一個基本字符用C進行計數的程序:「getchar()」函數如何將多個字符作爲輸入?

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

int main(){ 
    long nc = 0; 

    while(getchar() != EOF) 
     nc++; 
    printf("%ld\n" , nc); 
} 

當我輸入「ABCDE」作爲輸入時,它顯示的6的值,1爲換行字符(觸發EOF試驗後) 。但我的疑問是,getchar(),正如它的名字所暗示的那樣,只考慮了1個字符。但是當我一口氣進入「abcde」時,它仍然有效。這是爲什麼?我在這裏做什麼問題?

+3

每次通過循環只讀取一個字符。 nd統計這些通行證的數量。我不明白你爲什麼會認爲它很神祕。 –

+0

刪除循環,然後再看! – Olaf

回答

0

getchar從標準輸入的緩衝區中讀取下一個字符並返回它,因爲您將六個字符 - 「abcde \ n」輸入到標準輸入中,並且您在while循環中調用getchar,這意味着循環體是跑了六次,它逐個閱讀字符。您可以測試這種情形:當你在abcde\n(從產生輸入\n)型

int c; 
while ((c = getchar()) != EOF) { 
    printf("got %c\n", c); 
    nc++; 
} 
3

,它被衝入標準輸入流(stdin)。

getchar(),正如它的名字本身所暗示的,只需要1個字符考慮

是的,這是正確的。但請注意,getchar用於迴路,迴路直到getchar返回EOF。另外,回想一下,getcharstdin讀取輸入。

因此,在第一次迭代中,在鍵入數據後,getchar會讀取第一個字符a。在第二次迭代中,它不會等待輸入,因爲stdin仍然包含bcde\n,因此讀取下一個字符b等等。

最後,當您觸發EOF時,循環會中斷。然後,printf得到執行(打印6,因爲六個字符被讀取)並且程序結束。

+0

好的,但每次調用'getchar'時,都必須輸入一些內容。那麼爲什麼會發生這種情況,如果'stdin'中仍有'bcde \ n' – codetalker

+1

'getchar'等待輸入_if_ stdin是空的。否則,它不會消耗下一個字符。 –

11

默認情況下,標準輸入通過交互式設備進行行緩衝。這意味着你的程序將看不到任何輸入,直到一條完整的線路就緒,在你的情況下,當你點擊輸入。其中一個很好的理由是,如果用戶鍵入她的8位字符密碼,然後點擊退格鍵8次,然後鍵入她的用戶名並點擊輸入,那麼您的程序只會獲得她的用戶名,並且從不會看到更正,通常當你的shell在任何地方發送之前都有機會編輯你的輸入時你想要什麼。

所以會發生什麼本質上是這樣的:

  1. 你叫getchar()。沒有輸入可用,所以它等待。

  2. 您按a。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()沒有什麼可讀的,所以它仍然等待。

  3. 您按b。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()沒有什麼可讀的,所以它仍然等待。您可以按c。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()沒有什麼可讀的,所以它仍然等待。

  4. 您按d。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()沒有什麼可讀的,所以它仍然等待。

  5. 您按e。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()沒有什麼可讀的,所以它仍然等待。

  6. 您按輸入。現在它一行的結尾,所以輸入"abcde\n"是發送到你的程序。

  7. getchar()現在有輸入要讀取,所以它返回'a',增量nc,並循環回來等待輸入。

  8. ,立即getchar()有更多的投入從該行的其餘字符閱讀,因此它返回'b',增加nc,並返回到等待輸入。

  9. ,立即getchar()有更多的投入從該行的其餘字符閱讀,因此它返回'c',增加nc,並返回到等待輸入。

  10. ,立即getchar()有更多的投入從該行的其餘字符閱讀,因此它返回'd',增加nc,並返回到等待輸入。

  11. ,立即getchar()有更多的投入從該行的其餘字符閱讀,因此它返回'e',增加nc,並返回到等待輸入。

  12. 立即,getchar()有更多的輸入來讀取該行中其餘字符,因此它返回'\n',增量nc,並循環回來等待輸入。

  13. 如果您標誌着最終的投入,或許按控制 - d,然後getchar()無關閱讀並知道永遠不會有任何讀,所以它返回EOF和你的循環結束。如果它是而不是輸入結束,那麼getchar()將再次在此等待,以輸入新的輸入行。

那麼,這裏實際發生的是,getchar()什麼也沒做,直到你打輸入。然後,可能在您將手指從輸入鍵之前,它會運行六次並使用您輸入的六個字符的輸入。但是,儘管getchar()運行6次,只提示輸入一次東西(兩次,如果包括不必鍵入控制 - d),因爲getchar()僅會等待你輸入時,它已經沒有輸入可用並等待。

回到獨立終端常見的時代,實際的終端設備甚至可能不會將任何字符傳輸到計算機,直到行結束,並且可能有少量的板載內存允許這種類型本地的基於行的編輯,所以計算機本身可能從字面上看不到直到行尾。在許多人使用的現代PC中,操作系統在終端驅動程序層面更有可能緩衝這些字符本身,並且只顯示它們並使它們一次對應一行(除非您專門告訴它,你當然需要角色)。

相關問題