天天看點

c++中cin緩沖區三、cin.getline()四、getchar()

輸入過程:

程式輸入的時候都設有一個輸入緩沖區,每次輸入,當鍵盤輸入結束時會将輸入的資料存入輸入緩沖區,而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()有三種格式:

  1. 無參:cin.get();
  2. 一個參數:cin.get(char s);或者ch=cin.get(); 兩者等價
  3. 兩個參數: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()取走,最後的回車又被接收


           

繼續閱讀