C++程序存在多个cin输入时,后边的cin失效
Posted FightingBoom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++程序存在多个cin输入时,后边的cin失效相关的知识,希望对你有一定的参考价值。
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、问题现象,参考如下代码示例
#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;
上述代码,运行结果如下,在输入年份之后,直接就结束了,没有给输入地址的机会
What year was your house built?
1966
What is its street address?
Year built: 1966
Address:
Done!
2、问题原因:cin 输入会把换行符留在输入缓冲区,因此第二次获取输入时,首先获取到的就是换行符,导致第二次还没输入,就直接结束了;
3、解决方法
(1)获取输入之后,再次 get 一次,把换行符读出来,保持输入缓冲区无其他内容;
cin >> year; // 方法一
cin.get(); // 方法一
(2)获取输入之后,clear 清空缓冲区,然后 sync 同步缓冲区更改,这样也能保证缓冲区无其他内容;
cin >> year;
cin.clear();
cin.sync();
2.2 多个单词
1、针对多个单词输入的情况,就不能直接使用 cin 获取了,这样只会获得第一个单词;
2、此时可以使用 cin 库自带的接口 get 或者 getline ,以 getline 举例
#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;
如上代码,执行结果参考如下
What 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 即可;
cin.getline(cFirstName, 20);
cin.clear();
cin.sync();
3 总结
1、cin 获取输入时,会把换行符留在输入缓冲区,因此第二次获取输入时,会直接读取到换行符,就结束了,导致读取的数据是空。
2、解决思路很简单,就是把输入缓冲区清空,而清空缓冲区又有两种方法。
以上是关于C++程序存在多个cin输入时,后边的cin失效的主要内容,如果未能解决你的问题,请参考以下文章