字符串输入验证(C ++)的问题

时间:2019-02-21 22:42:11

标签: c++ string validation

尝试验证用户输入时遇到问题。这是我的代码:

#include <iostream>
#include <string>

using namespace std;

int main() 
{
  string choice;


  cout << "Please type something: ";
  cin >> choice;
  cin.ignore();

  while (choice != "1" && choice != "2" && choice != "3" && choice != "4" && choice != "5")
  {
    cout << "Incorrect choice! Please input a valid number: >_";
    cin >> choice;
    cin.ignore();
  } 

  return 0;
}

当我输入“ wronginput”时,该输入落入while循环并显示

  

错误的选择!请输入一个有效的数字:> _

哪个好。但是,当我尝试“错误输入”时,会得到“奇怪”的版本:

  

错误的选择!请输入有效的数字:> _错误的选择!请输入一个有效的数字:> _

我的猜测是罪魁祸首。有什么办法可以解决这个问题吗?谢谢。

2 个答案:

答案 0 :(得分:1)

当您输入“错误输入”作为输入时,该行

cin >> choice;

choice中读取并存储“错误”。

cin.ignore();

仅忽略一个字符。因此,您将在流中添加“输入”和后续换行符。下次读choice时,您会在choice中得到“输入”。

这说明了程序的行为。

为了修复它,请确保忽略该行的其余部分,而不仅仅是一个字符。使用

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

添加

#include <limits>

能够使用std::numeric_limits

答案 1 :(得分:0)

这是因为std::cin >> choice是一种格式化的输入,它将把所有内容读取到下一个空格

当您输入“ wronginput”时,它将全部读取,但是如果您输入“ wrong input”,则只会读取“ wrong”部分。您的while循环将触发,在其主体内再次执行std::cin >> choice,它将显示为“输入”。

此行为使您的程序连续两次输出消息。

如何解决?而不是读取单个令牌,直到下一个空格,请考虑读取整行


如何实现?只需使用

std::cin >> choice;

使用std::getline函数:

std::getline(std::cin, choice);

while循环的内部和外部。