基本介紹
stdin是標準輸入 std即standard(標準),in即input(輸入),合起來就是標準輸入。 一般就是指鍵盤輸入到緩衝區裡的東西
示例:一個最簡單的小程式,它的功能是從鍵盤輸入字元,然後將其送到控制台。採用perl語言實現,你可以這樣寫:
簡單地說,<STDIN>是一個專用的檔案句柄,在本例中它屬於標準輸入快取(稱為STDIN),通常是連線到鍵盤。每次我們將<STDIN>的值賦給變數$line時,即為將STDIN快取中的首行取出,然後放入$line。當到達快取最後一行時,就會取出while語句判斷條件為假的(EOF)檔案結束標識符。程式的其它部分很簡單可以這樣解釋。現在我們已經將輸入信息放入$line變數,接著我們就可以用print函式將其列印到螢幕。或者更準確地說,列印到通常連線顯示器的標準輸出快取。標準輸入和輸出快取都可以重定向,例如可重定向到保存程式結果的某個檔案中,如果是在處理文本,那么通常可以認為這與鍵盤及顯示器是等價的。
程式詳情
你可能會認為這一程式已經是最短的了,但是通過使用perl的特殊變數,它還可以更短。
它還可以這樣書寫:
stdin流阻塞的分析
以scanf函式為例,運行下述程式
我們定義了a,b,c三個變數來接受輸入的內容,定義了變數ret來接收scanf函式的返回值。
正確輸入的話:
![stdin](/img/7/8aa/wZwpmL3UDO2YTO3ADO0YzM1UTM1QDN5MjM5ADMwAjMwUzLwgzLxMzLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
但是當輸入內容與格式換字元串不匹配時,結果會令人大跌眼鏡(仔細分析會對stdin流有更深入理解的喔):
![stdin](/img/0/2df/wZwpmL3MjNxEzM3ADO0YzM1UTM1QDN5MjM5ADMwAjMwUzLwgzLwczLt92YucmbvRWdo5Cd0FmL0E2LvoDc0RHa.jpg)
執行到第一個scanf時,當輸入字元’b’的時候與ret=scanf("%d%d%d",&a,&b,&c);中的格式化字元串不匹配,stdin流被阻塞,scanf函式不在讀取後面的部分,直接將1返回,表示只將stdin流中的1讀入到了變數a中。
執行到第二個scanf時,字元’b’還是與格式化字元串不匹配,stdin流仍然被阻塞,所以沒有提示輸入,scanf函式將0返回。
將代碼作如下修改,可以有力的證明上述結論。
當把第二個scanf函式內的格式化字元串改為”%c%d%d”時,運行結果如下:
![stdin](/img/c/71e/wZwpmLzATNygTN5QjN0YzM1UTM1QDN5MjM5ADMwAjMwUzL0YzL2AzLt92YucmbvRWdo5Cd0FmLwE2LvoDc0RHa.jpg)
執行到第一個scanf函式時,由於輸入’b’的原因scanf函式直接返回1,stdin流阻塞。
執行到第二個scanf函式時,字元’b’與格式化字元串”%c%d%d”中的%c匹配,stdin流終於疏通,在輸入6,則將變數a,b,c分別賦值為98(‘b’的ASCII碼)、2、6,scanf函式返回3。
在scanf函式使用fflush(stdin);,清空輸入緩衝區:
運行結果
![stdin](/img/9/b0a/wZwpmLygjNzIjM3QDO0YzM1UTM1QDN5MjM5ADMwAjMwUzL0gzL0czLt92YucmbvRWdo5Cd0FmLxE2LvoDc0RHa.jpg)
stdin流在實際中經常由於一些不正確的使用發生阻塞,注意使用fflush(stdin);,可以解決很多問題喔!
相關信息
stdout(Standardoutput)標準輸出
stdin(Standardinput)標準輸入
stderr(Standarderror)標準錯誤