寫演算法時,經常會遇到輸入的要求,一般分為三種,以int數字為例,分為輸入單個、多個、未知個幾種情況,有時需要考慮換行符『\n』的問題
此時使用直接scanf操作即可
int temp;
scanf
("%d"
,&temp)
;
數量不多時,直接scanf操作,數量多可以使用for迴圈進行輸入
int nums[10]
=;scanf
("%d %d %d %d"
,&nums[0]
,&nums[1]
,&nums[2]
,&nums[3]
);//or
for(
int i =
0;i<
10;i++
)scanf
("%d"
,nums[i]
);
可以將scanf結合getchar一起使用,使用getchar()獲取換行符作為結束的條件。
int temp[10]
;int i =0;
while(1
)for
(int j =
0; j
) cout<
<<
" ";
上述**,測試用例:
1 2 3 4 5
1 2 3 4 5
可以看到,scanf獲取數字後,getchar獲取了數字後的字元,getchar先後獲得了4個空格「 」,最後獲得了換行符「\n」。模板:
int nums[
100]
;int n =0;
dowhile
(getchar()
!='\n'
);
eof是檔案結束標誌,標準輸入要輸入eof需要通過通過輸入鍵盤組合鍵,ctrl+d(linux)或ctrl+z(windows)。
步驟:輸入多組資料,日「1 2 3 4 5」
回車,觸發io操作,scanf是忽視換行符的
window下按組合鍵「ctrl+z」,輸入結束
int i=0;
int temp[10]
;while
(scanf
("%d"
,&temp[i])!=
eof)
for(
int j =
0; j
)
int nums[
100]
;int n =0;
while(~
scanf
("%d"
,&nums[n++])
);for(
int j =
0; j
1; j++
)
關於eof的更多解釋,檢視
關於while(cin>>n)
的分析,這裡不討論,
參考:getchar是字元函式,返回值是對應字元的assic值。注意,getchar不接受字串,輸入字串只能使用獲取第乙個字元。可以使用gets()獲取字串,與scanf(「%s」)不同的是,gets可以接收空格等,這也是它存在的意義。
char temp =
getchar()
; cout<
//輸入:wuhan
//輸出:w
可以接受空格:
案例:如我需要接收乙個數字和乙個字串,利用scanf接受數字後,使用gets接受字串,結果輸入數字後程式直接結束了。
分析:scanf()函式執行時,enter觸發i/o操作,即換行符是輸入結束的標誌。此時,所有的輸入均儲存在緩衝區中,包括最後的換行符「\n」。而scanf不會讀取換行符,所以最後換行符滯留在換行符中。同時,gets函式的結束的判斷條件是換行符,所以此時gets函式獲取換行符後直接結束了輸入。
在這種情況下,需要用getchar()來吃掉回車;
如:
當你輸入一次後,進行第二次輸入時但是程式直接結束了,此時需要考慮是否換行符需要處理。因為一些函式忽視換行符,而一些函式不忽視換行符。不忽視時,通常作為輸入的結束標誌。
(1)使用gets()前處理滯留的換行符
(2)2個使用getchar接收字元,中間需要乙個空的getchar()吃回車
c++語言中,換行符案例:
cin和scanf時忽視換行符的,cin.getline和gets都是不忽視換行符的。
帶有緩衝區的字元輸入流
帶有緩衝區的字元輸入流 使用這個流的時候,不需要自定義char陣列,或者不用定義byte陣列,自帶緩衝 當乙個流的構造方法中,需要乙個流的時候,這個被傳進來的流叫做節點流,外部負責包裝的流,叫做包裝流,或者處理流。建立物件時 bufferedreader的構造方法特殊,要接受乙個reader型別的引...
輸入緩衝區與輸出緩衝區
本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...
清理cin輸入緩衝區 在C 中清除輸入緩衝區
問題引入 用過c 的都明白,在運用輸入過程中會出現不經意間意外輸入錯誤的情況,導致之後的輸入無效,c 內部會繼續使用之前的意外輸入,使得程式執行錯誤。輸入緩衝區 所有從鍵盤輸入的資料,不管是字元還是數字,都是先儲存在記憶體中的乙個緩衝區裡面,叫做鍵盤緩衝區,簡稱輸入緩衝區或者輸入流。當一次鍵盤輸入結...