1 参考资料
1、https://www.cnblogs.com/pengjun-shanghai/p/4800871.html
2、《C++ Primer Plus(第6版)中文版》,第 4.2.5 小节,混合输入字符串和数字,P81;
3、代码测试 Git 仓库地址:https://github.com/FightingBoom/studycode
2 情况分类
2.1 一个单词
1、问题现象,参考如下代码示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include <iostream> int main() { using namespace std; cout << "What year was your house built?n"; int year; cin >> year; // 原始方法 cout << "What is its street address?n"; char address[80]; cin.getline(address, 80); cout << "Year built: " << year << endl; cout << "Address: " << address << endl; cout << "Done!n"; return 0; }
上述代码,运行结果如下,在输入年份之后,直接就结束了,没有给输入地址的机会
1
2
3
4
5
6
7What year was your house built? 1966 What is its street address? Year built: 1966 Address: Done!
2、问题原因:cin 输入会把换行符留在输入缓冲区,因此第二次获取输入时,首先获取到的就是换行符,导致第二次还没输入,就直接结束了;
3、解决方法
(1)获取输入之后,再次 get 一次,把换行符读出来,保持输入缓冲区无其他内容;
1
2
3
4
5cin >> year; // 方法一 cin.get(); // 方法一
(2)获取输入之后,clear 清空缓冲区,然后 sync 同步缓冲区更改,这样也能保证缓冲区无其他内容;
1
2
3
4cin >> year; cin.clear(); cin.sync();
2.2 多个单词
1、针对多个单词输入的情况,就不能直接使用 cin 获取了,这样只会获得第一个单词;
2、此时可以使用 cin 库自带的接口 get 或者 getline ,以 getline 举例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34#include <iostream> using namespace std; int main() { char cFirstName[20]; // first name,根据需要增大数组容量 char cLastName[20]; // last name,根据需要增大数组容量 char cGrade; // grade int iAge; // age cout << "What is your first name? "; cin.getline(cFirstName, 20); cin.clear(); cin.sync(); cout << "What is your last name? "; cin.getline(cLastName, 20); cin.clear(); cin.sync(); cout << "What letter grade do you deserve? "; cin.get(cGrade); cin.clear(); cin.sync(); cout << "What is your age? "; cin >> iAge; cin.clear(); cin.sync(); cout << "Name: " << cLastName << ", " << cFirstName << endl; cout << "Grade: " << (char)(cGrade + 1) << endl; cout << "Age: " << iAge << endl; return 0; }
如上代码,执行结果参考如下
1
2
3
4
5
6
7
8What is your first name? Betty Sue What is your last name? Yewe What letter grade do you deserve? B What is your age? 22 Name: Yewe, Betty Sue Grade: C Age: 22
3、针对多个单词输入,需要使用 getline ;
4、同样的,该测试代码有多次 cin 输入的情况,就可以使用之前的方法,先 clear ,在 sync 即可;
1
2
3
4
5cin.getline(cFirstName, 20); cin.clear(); cin.sync();
3 总结
1、cin 获取输入时,会把换行符留在输入缓冲区,因此第二次获取输入时,会直接读取到换行符,就结束了,导致读取的数据是空。
2、解决思路很简单,就是把输入缓冲区清空,而清空缓冲区又有两种方法。
最后
以上就是儒雅银耳汤最近收集整理的关于C++程序存在多个cin输入时,后边的cin失效1 参考资料2 情况分类3 总结的全部内容,更多相关C++程序存在多个cin输入时,后边的cin失效1内容请搜索靠谱客的其他文章。
发表评论 取消回复