-
stdin
鎖定
- 中文名
- 標準輸入
- 外文名
- stdin
- 類 別
- 程序從外界讀入的機制
- 功 能
- 鍵盤輸入字符將其送到控制枱
- 採 用
- perl語言實現
stdin基本介紹
while($line=<STDIN>) { print$line; }
簡單地説,<STDIN>是一個專用的文件句柄,在本例中它屬於標準輸入緩存(稱為STDIN),通常是連接到鍵盤。每次我們將<STDIN>的值賦給變量$line時,即為將STDIN緩存中的首行取出,然後放入$line。當到達緩存最後一行時,就會取出while語句判斷條件為假的(EOF)文件結束標識符。程序的其它部分很簡單可以這樣解釋。現在我們已經將輸入信息放入$line變量,接着我們就可以用print函數將其打印到屏幕。或者更準確地説,打印到通常連接顯示器的標準輸出緩存。標準輸入和輸出緩存都可以重定向,例如可重定向到保存程序結果的某個文件中,如果是在處理文本,那麼通常可以認為這與鍵盤及顯示器是等價的。
stdin程序詳情
你可能會認為這一程序已經是最短的了,但是通過使用perl的特殊變量,它還可以更短。
它還可以這樣書寫:
while(<STDIN>) { print; }
stdin流阻塞的分析
以scanf函數為例,運行下述程序
#include <bits/stdc++.h> int main (int argc, char * argv[]) { int a = 0; int b = 0; int c = 0; int ret = 0; ret = scanf("%d %d %d",&a,&b,&c); printf("第一次讀入數量:%d\n",ret); ret = scanf("%d %d %d",&a,&b,&c); printf("第二次讀入數量:%d\n",ret); return 0; }
正確輸入的話:
但是當輸入內容與格式換字符串不匹配時,結果會令人大跌眼鏡(仔細分析會對stdin流有更深入理解的哦):
執行到第一個scanf時,當輸入字符’b’的時候與ret=scanf("%d%d%d",&a,&b,&c);中的格式化字符串不匹配,stdin流被阻塞,scanf函數不在讀取後面的部分,直接將1返回,表示只將stdin流中的1讀入到了變量a中。
執行到第二個scanf時,字符’b’還是與格式化字符串不匹配,stdin流仍然被阻塞,所以沒有提示輸入,scanf函數將0返回。
將代碼作如下修改,可以有力的證明上述結論。
#include <bits/stdc++.h> int main (int argc , char * argv[]) { int a = 0; int b = 0; int c = 0; int ret = 0; ret = scanf("%d %d %d",&a,&b,&c); printf("第一次讀入數量:%d\n",ret); ret = scanf("%c %d %d",&a,&b,&c); printf("第二次讀入數量:%d\n",ret); return 0; }
當把第二個scanf函數內的格式化字符串改為”%c%d%d”時,運行結果如下:
執行到第一個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);,清空輸入緩衝區:
#include<bits/srdc++.h> int main (int argc ,char * argv[]) { int a = 0; int b = 0; int c = 0; int ret = 0; ret = scanf("%d %d %d",&a,&b,&c); fflush(stdin); printf("第一次讀入數量:%d\n",ret); ret = scanf("%d %d %d",&a,&b,&c); fflush(stdin); printf("第二次讀入數量:%d\n",ret); return 0; }
運行結果
stdin流在實際中經常由於一些不正確的使用發生阻塞,注意使用fflush(stdin);,可以解決很多問題哦!
stdin其他信息
stdout(Standardoutput)標準輸出
stdin(Standardinput)標準輸入
stderr(Standarderror)標準錯誤