cin流 喫過的虧!

在getline的代碼上方使用過cin流來獲取過鍵盤輸入時,getline會出現直接跳過。

#include<bits/stdc++.h>
using namespace std;

int mian()
{
    int x = 0;
	cin >> x;
    //cin.ignore();
    //cin.sync();

	string str;
    getline(cin, str);
    cout << str << endl;
    
    system("pause");
    return 0;
}

這段代碼可以如期進行嗎?

肯定是不行的,不然我也不會寫出來。。。

這時候輸入了 x 之後,程序就直接結束了。爲啥呢?

因爲cin流中還殘餘了換行符,getline() 就直接讀入換行符,然後程序結束。

想要解決這個問題,可以加上第8行註釋中的語句,清空cin流,然後就可以正常輸入字符串到 str 中了。

cin.ignore(int a = 1, char ch = EOF) 這個函數會忽略 a 個字符,直到字符是 ch 爲止。

在這裏 cin.sync() 也有同樣的功能。

cin流失效

在搜索資料的過程中又發現了cin流失效的問題。

#include<bits/stdc++.h>

using namespace std;

int main()
{
    int x = 0;
	cin >> x;  //如果此時輸入字母a
	cout << "x = " << x << endl;

	//cin.clear();
	//cin.ignore();
    
	cin >> x;
	cout << "x = " << x << endl;

	string str;
	getline(cin, str);
	cout << str << endl;
    
    system("pause");
    return 0;
}

如果程序運行到第八行時輸入了字母 a ,因爲接收字母 a 的變量是 int 類型的,此時cin流會出錯, cin.fail() == 1 。cin流會失效後,會直接輸出 x = 0

在這裏插入圖片描述

此時如果第二個 cin >> x 想要正常輸入,則需要將第11,12行中語句加上,cin.clear() 是重置錯誤標誌位,cin.ignore() 是清除一個cin流中的字符。加上這兩句後就可以正常輸入數字到 x 中了。

推介看看參考4,有非常多具體實例,還討論了cin.clear()cin.ignore() 的使用先後順序問題(先使用 cin.clear() 重置錯誤標誌位,然後清空cin緩存區)。

先使用cin.ignore()然後用getline()讀入一行,會少一個字符

#include<bits/stdc++.h>

using namespace std;

int main()
{
	cin.ignore(5'\n');

	string str;
	getline(cin, str);
	cout << str << endl;
    
    system("pause");
    return 0;
}

這個簡單示例,就更進一步演示了 cin.ignore() 的功能,就是忽略cin流中指定數目的字符,直到遇到指定字符。

參考1:link1

參考2:link2

參考3:link3

參考4:link4

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章