为什么cin >>(int)失败后cin >>(string)停止了?

时间:2018-12-13 12:56:13

标签: c++ cin

当cin >>(int)和cin >>(string)被调用时,如果第一个输入的整数不正确,即使cin >>(string)似乎也无法检索第二个输入正确的字符串。

源代码很简单:

cout<<"Please enter count and name"<<endl;;
int count;
cin>>count;     // >> reads an integer into count
string name;
cin>>name;      // >> reades a string into name

cout<<"count: "<<count<<endl;
cout<<"name: "<<name<<endl;

测试用例是:

情况1:键入不适合int的字符和字符

请输入计数和名称

ad st

计数:0

名称:

情况2:键入数字和字符

请输入计数和名称

30个广告

个数:30

名称:广告

情况3:键入数字和数字(可以视为字符串)

请输入计数和名称

20 33

个数:20

名称:33

2 个答案:

答案 0 :(得分:5)

流具有内部错误标志,该标志一旦置位,就保持置位状态,直到您明确将其清除为止。当读取失败时,例如因为无法将输入转换为所需的类型,所以设置了错误标志,并且只要您不清除此标志就不会尝试任何后续读取操作:

int main() {

    stringstream ss("john 123");

    int testInt;
    string testString;

    ss >> testInt;
    if (ss) {
        cout << "good!" << testInt << endl;
    } else {
        cout << "bad!" << endl;
    }

    ss >> testString;
    if (ss) {
        cout << "good!" << testString << endl;
    } else {
        cout << "bad!" << endl;
    }

    ss.clear();
    ss >> testString;
    if (ss) {
        cout << "good:" << testString << endl;
    } else {
        cout << "bad!";
    }
}

输出:

bad!
bad!
good:john

答案 1 :(得分:0)

您可以使用

检查输入语句是否成功。
  

cin.good()方法

如果输入语句失败,则返回false,否则返回true。这是一个小例子:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
  int x; 

  // prompt the user for input 
  cout << "Enter an integer: " << "\n"; 
  cout << "cin.good() value: " << cin.good() << "\n";
  // get input 
  cin >> x; 
  cout << "cin.good() value: " << cin.good() << "\n";
  // check and see if the input statement succeeded 
  if (!cin) { 
    cout << "That was not an integer." << endl; 
    return EXIT_FAILURE; 
  } 

  // print the value we got from the user 
  cout << x << endl; 
  return EXIT_SUCCESS; 
}

输出:

Enter an integer: 
cin.good() value: 1
asd
cin.good() value: 0
That was not an integer.