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失效的主要内容,如果未能解决你的问题,请参考以下文章

C++程序存在多个cin输入时,后边的cin失效

C++程序存在多个cin输入时,后边的cin失效

关于c++中cin的一个小问题。请大家帮我解答一下

C++ 关于cin输入

在 C++ 程序中使用 scanf() 比使用 cin 更快?

何时以及为啥需要在 C++ 中使用 cin.ignore()?