c++ 标准库中 cin.ignore()
cin.ignore()函數(shù)是C++標(biāo)準(zhǔn)輸入流(cin)中的一個方法。cin.ignore()函數(shù)中有兩個參數(shù),分別為數(shù)值型的a 和 字符型的 ch ,即cin.ignore( a, ch )。它表示從輸入流 cin 中提取字符,提取的字符被忽略,不被使用。而每拋棄一個字符,它都要進(jìn)行計數(shù)和比較字符:如果計數(shù)值達(dá)到 a 或者被拋棄的字符是 ch ,則cin.ignore() 函數(shù)執(zhí)行終止;否則,它繼續(xù)等待。
它的一個常用功能就是用來清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對下一次輸入的影響。例如可以這么用,cin.ignore(1024, '\n'),通常把第一個參數(shù)設(shè)置得足夠大,這樣實際上是為了只有第二個參數(shù) '\n' 起作用,所以這一句就是把回車(包括回車)之前的所以字符從輸入緩沖流中清除出去。
如果默認(rèn)不給參數(shù)的話,默認(rèn)參數(shù)為cin.ignore(1, EOF),即把EOF前的1個字符清掉,沒有遇到EOF就清掉一個字符然后結(jié)束。
下面用一個例子簡單說明cin.ignore()函數(shù)的用法:
比如我們要求接受輸入一個字符串(沒有空格),然后輸出該字符串。C++代碼如下:
#include <iostream>
using namespace std;
?
int main()
{
? ? char str[30];
? ? cout << "請輸入一個字符串:";
? ? cin >> str;
? ? cout << str << endl;
?
? ? return 0;
}
運行如下圖:
當(dāng)按下任意鍵時,運行程序會立即退出。如果想讓程序停留一下,不要立即退出。我們很容易想到讓程序末尾再接受一個輸入,輸入任意一個字符后程序退出。因此,我們在原先代碼加上一個輸入即cin.get(),代碼如下:
#include <iostream>
using namespace std;
?
int main()
{
?? ?char str[30];
?? ?cout << "請輸入一個字符串:";
?? ?cin >> str;
?? ?cout << str << endl;
?
?? ?cout << "請輸入任意字符結(jié)束程序!\n";
?? ?cin.get();
?
?? ?return 0;
}
此時運行如下圖:
按下任意鍵程序仍然會立即退出而不停留,這與我們想要的結(jié)果不一致。這是為什么呢?
如果在程序末尾再多接受一個輸入,即在代碼上再加一個cin.get(),再次運行如下圖:
此時輸入字符 a 時,程序沒有立即退出,達(dá)到了我們預(yù)計的要求。
回過頭來想,為什么加入第一個cin.get()不行呢?那肯定是因為第一個cin.get()獲取了某個字符,仔細(xì)考慮一下,不難想到當(dāng)輸入"hello"過后按下了回車鍵,因而第一個cin.get()獲取到的就是 '\n' 。在不加入第二個cin.get()情況下,我們可以想到用cin.ignore()函數(shù),將cin中提取的 '\n' 忽略掉。具體代碼如下:
#include <iostream>
using namespace std;
?
int main()
{
?? ?char str[30];
?? ?cout << "請輸入一個字符串:";
?? ?cin >> str;
?? ?cout << str << endl;
?
?? ?cin.ignore(100, '\n');
?? ?cout << "請輸入任意字符結(jié)束程序!\n";
?? ?cin.get();
?
?? ?return 0;
}
運行如下:
此時,和加入兩個cin.get()一樣得到相同的結(jié)果,加入cin.ignore(100, '\n');這行代碼的作用就是將輸入"hello"過后按下的回車給忽略掉。
————————————————
版權(quán)聲明:本文為CSDN博主「micro小寶」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wxbmelisky/article/details/48596881
總結(jié)
以上是生活随笔為你收集整理的c++ 标准库中 cin.ignore()的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个关于clear()、吸收缓存区的帖子
- 下一篇: VS2019项目打包生成.exe文件与S