首页 文章

在C中使用stringstream和int变量来验证输入是否为int

提问于
浏览
0
void get_english_input() {
    string input = " ";
    stringstream my_string(input);
    int ft;
    double in;

    while(true) {    
        cout << "Enter an integer value of feet." << endl;
        getline(cin, input);
        my_string << input;
        if(my_string >> ft)
            break;
        cout << "Invalid input! Please try again." << endl;
    }
    cout << "you entered " << ft << " as the int value for feet." << endl;
    /*while(true) {
        cout << "Enter a double value of inches." << endl;
        getline(cin, input);
        my_string << input;
            break;
    cout << "Invalid input! Please try again." << endl;
    }
    cout << "we are done entering english input" << endl;
    cout << "feet = " << ft << endl;
    cout << "inches = " << in << endl;*/
}

这段代码应该通过尝试将my_string的内容放入ft来测试输入是否为整数 . 如果我输入一个字母而不是整数,我会收到错误消息“输入无效!请再试一次”,这是什么应该发生 . 问题是,在我收到一次消息之后,即使下一个输入有效,我也会在之后的每个输入中得到它 .


有人建议我应该使用 std::cin.clear(); 清除错误标志 . 我尝试将它放在getline()之前,并没有改变问题 . 我错误地使用了这个吗?

4 回答

  • 3

    我认为

    mystring >> ft
    

    将始终评估为真(如果mystring为空,可能不会) . 无论mystring是否实际包含数字,该操作仍然有效 .

    一个想法是

    size_t found=input.find_first_not_of("0123456789 ");
      if (found!=string::npos)
      {
       cout <<   "Invalid input! Please try again."
      }
    

    改编自here.

  • 0

    蛮力解决方案是将输入转储到std :: string中,然后遍历字符串并检查每个字符是否在0到9之间 .

    这不是最优雅的方法 . 但这很简单而且很愚蠢 . :-)

    bool isnum(char c)
    {
       if(! ( c <= '9' && c >= '0'))
       {  
           return false;
       }
       return true;
    }
    
    
    bool has_int(std::string &s)
    {
       for( int i = 0; i < s.length(); i++)
       {
          if( ! isnum(s[i])
          {
             return false;
          }
       }
    
       return true;
    }
    
  • 0

    您可以重置my_string的错误状态:

    my_string.clear();
    my_string.ignore( /* big number of choice */ );
    

    但我认为每次重新初始化它会更容易:

    while(true) {    
        cout << "Enter an integer value of feet." << endl;
        getline(cin, input);
        stringstream my_string(input);
    
  • 1

相关问题