輸入過程:
程式輸入的時候都設有一個輸入緩沖區,每次輸入,當鍵盤輸入結束時會将輸入的資料存入輸入緩沖區,而cin直接從輸入緩沖區中取資料。正因為cin是直接從緩沖區取資料的,是以有時候當緩沖區中有殘留資料時,cin會直接取得這些殘留資料而不會請求鍵盤輸入。
一、cin
#include <iostream>
using namespace std;
int main()
{
string s;
cout<<"cin test:"<<endl;
cin>>s;
cout<<s<<endl;
cin>>s;
cout<<s<<endl;
return 0;
}
運作情況:
一、
輸入abc[空格]def,
輸出:
abc
def
cin test:
abc def
abc
def
二、
輸入abc[Tab]def
輸出:
abc
def
cin test:
abc def
abc
def
cin在遇到空格、回車、以及tab鍵都會結束讀取,此時若輸出緩沖區還有資料,則下一個cin會直接取走輸入,而不會請求鍵盤輸入,對于回車,最後的enter也會儲存在緩沖區。
對于這種情況,可以用
cin.sync();
來清空緩沖區,加上之後:
#include <iostream>
using namespace std;
int main()
{
string s;
cout<<"cin test:"<<endl;
cin>>s;
cout<<s<<endl;
cin.sync();
cin>>s;
cout<<s<<endl;
return 0;
}
輸入:abc[空格]def,
輸出:abc
輸入:def
輸出:def
cin test:
abc def
abc
def
def
二、cin.get()
輸入結束的條件:Enter鍵,但不丢棄Enter
cin.get()有三種格式:
- 無參:cin.get();
- 一個參數:cin.get(char s);或者ch=cin.get(); 兩者等價
- 兩個參數:cin.get(數組名,數組長度);
看一個例子:
#include<iostream>
using namespace std;
int main()
{
char c1, c2;
cin.get(c1);
cin.get(c2);
cout<<c1<<""<<c2<<endl;
cout<<(int)c1<<" "<<(int)c2<<endl;
return 0;
}
列印兩個字元,并輸出他們的ascll碼
測試一:
輸入:ab
輸出:ab
97 98
測試二:
輸入:a b
輸出:a
97 32
此測試說明cin.get()将空格讀入
測試三:
輸入:a[回車]
輸出:a
[回車]
97 10
此測試說明cin.get()将回車讀入
cin.get()可以用于對于一個輸入按回車結束的情況,例如:
while(cin>>a)
{
if(cin.get()=='\n')//cin.get清除輸入不是整形的内容,但他不會忽略空格和換行。
break;
}
看一下接收數組的情況:
#include<iostream>
using namespace std;
int main()
{
char a[20];
cin.get(a,5);
cout<<a<<endl;
return 0;
}
測試一
輸入:abcdef
輸出:abcd
輸入超出長度,隻輸出abcd
測試二
輸入:ab[空格]c
輸出:ab[空格]c
輸入時遇到Enter結束輸入,可接受空格,Tab鍵
#include<iostream>
using namespace std;
int main()
{
char ch='a',a[20];
cin.get(a,5);
cin.get(ch);
cout<<a<<endl;
cout<<ch<<endl;
cout<<(int)ch<<endl;
return 0;
}
輸入:12[空格]3[回車]
輸出:12[空格]3
10
遇到換行符時結束讀取,但是不對換行符進行處理,換行符仍然殘留在輸入緩沖區。
三、cin.getline()
cin.getline()與 cin.get(數組名,長度)的讀取方式類似,以Enter結束,可以接受空格。按照長度讀取字元, 會丢棄最後的Enter(cin.get()不會丢棄),兩者都會在讀取的字元串後面自動加上’\0’
這兩個函數的差別在于:
-
cin.get(數組名, 長度),當輸入的字元串超長時,不會引起cin的錯誤,後面的cin操作會繼續執行,隻是直接從緩沖區中取資料。
cin.get讀取一行時,遇到換行符(自定義結束符)時結束讀取,但是不對換行符(自定義結束符)進行處理,換行符(自定義結束符)仍然保留在輸入緩沖區。
-
cin.getline()當輸入超長時,會引起cin函數的錯誤,後面的cin操作将不再執行。之後如果用ch=cin.get()是讀取不到留在緩沖區中的資料的。
getline讀取一行字元時,預設遇到’\n’(自定義結束符)時終止,并且将’\n’(自定義結束符)直接從輸入緩沖區中删除掉,不會影響下面的輸入處理。
看段代碼測試:
#include <iostream>
using namespace std;
int main()
{
char ch, a[20];
cin.getline(a,5);
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return 0;
}
測試一:
輸入:abcde
輸出:abcd
0
測試二:
輸入:ab[空格]c
a
輸出:ab[空格]c
97
四、getchar()
這是c語言中的函數,用來從緩沖區取走一個字元,一般都是用來取走回車
#include<iostream>
using namespace std;
int main()
{
char c1, c2;
cin.get(c1);
getchar();
cin.get(c2);
cout<<c1<<" "<<c2<<endl;
cout<<(int)c1<<" "<<(int)c2<<endl;
return 0;
}
測試一
輸入:ab[回車]
輸出:a
[回車]
97 10
這裡是接收完a後,getchar()将b取走,此時按下回車,然後繼續接收一個回車
測試二
輸入:a[回車]
b
輸出:a b
97 98
輸入a取走後按下的回車被getchar()取走,然後繼續輸入b取走b
測試三
輸入:a[空格][回車]
輸出:a
[回車]
97 10
輸入a後,a被接收,然後空格被getchar()取走,最後的回車又被接收