默認情況下,標準輸入通過交互式設備進行行緩衝。這意味着你的程序將看不到任何輸入,直到一條完整的線路就緒,在你的情況下,當你點擊輸入。其中一個很好的理由是,如果用戶鍵入她的8位字符密碼,然後點擊退格鍵8次,然後鍵入她的用戶名並點擊輸入,那麼您的程序只會獲得她的用戶名,並且從不會看到更正,通常當你的shell在任何地方發送之前都有機會編輯你的輸入時你想要什麼。
所以會發生什麼本質上是這樣的:
你叫getchar()
。沒有輸入可用,所以它等待。
您按a。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()
沒有什麼可讀的,所以它仍然等待。
您按b。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()
沒有什麼可讀的,所以它仍然等待。您可以按c。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()
沒有什麼可讀的,所以它仍然等待。
您按d。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()
沒有什麼可讀的,所以它仍然等待。
您按e。這不是一行的結尾,所以沒有輸入發送到您的程序,getchar()
沒有什麼可讀的,所以它仍然等待。
您按輸入。現在它是一行的結尾,所以輸入"abcde\n"
是發送到你的程序。
getchar()
現在有輸入要讀取,所以它返回'a'
,增量nc
,並循環回來等待輸入。
,立即getchar()
有更多的投入從該行的其餘字符閱讀,因此它返回'b'
,增加nc
,並返回到等待輸入。
,立即getchar()
有更多的投入從該行的其餘字符閱讀,因此它返回'c'
,增加nc
,並返回到等待輸入。
,立即getchar()
有更多的投入從該行的其餘字符閱讀,因此它返回'd'
,增加nc
,並返回到等待輸入。
,立即getchar()
有更多的投入從該行的其餘字符閱讀,因此它返回'e'
,增加nc
,並返回到等待輸入。
立即,getchar()
有更多的輸入來讀取該行中其餘字符,因此它返回'\n'
,增量nc
,並循環回來等待輸入。
如果您標誌着最終的投入,或許按控制 - d,然後getchar()
無關閱讀並知道永遠不會有任何讀,所以它返回EOF
和你的循環結束。如果它是而不是輸入結束,那麼getchar()
將再次在此等待,以輸入新的輸入行。
那麼,這裏實際發生的是,getchar()
什麼也沒做,直到你打輸入。然後,可能在您將手指從輸入鍵之前,它會運行六次並使用您輸入的六個字符的輸入。但是,儘管getchar()
運行6次,你只提示輸入一次東西(兩次,如果包括不必鍵入控制 - d),因爲getchar()
僅會等待你輸入時,它已經沒有輸入可用並等待。
回到獨立終端常見的時代,實際的終端設備甚至可能不會將任何字符傳輸到計算機,直到行結束,並且可能有少量的板載內存允許這種類型本地的基於行的編輯,所以計算機本身可能從字面上看不到直到行尾。在許多人使用的現代PC中,操作系統在終端驅動程序層面更有可能緩衝這些字符本身,並且只顯示它們並使它們一次對應一行(除非您專門告訴它,你當然需要角色)。
每次通過循環只讀取一個字符。 nd統計這些通行證的數量。我不明白你爲什麼會認爲它很神祕。 –
刪除循環,然後再看! – Olaf