失败的输入帮助,国际和字符,C++
Failed Input help, Int and Char, C++
我试图确定用户是否输入字符以外的内容,特别是他们只输入m或s。请参阅下面的代码。
注意:
filingStatus
是一个char
do
{
cout << "Please enter your filing status (s for single, m for married)" << 'n';
cin >> filingStatus;
if (cin.fail())
{
cin.clear();
dataTest = 1;
cout << "Error, please enter a valid input!" << 'n';
double dummyDouble;
cin >> dummyDouble;
if (cin.fail())
{
cin.clear();
cin >> dummyString;
}
}
else
{
if (filingStatus == 'm' || filingStatus == 's')
{
dataTest = 0;
}
else
{
cout << "Error, please enter either m or s!" << 'n';
dataTest = 1;
}
}
} while (dataTest == 1);
这就是问题所在,例如,如果我输入 1000,输入不会失败。相反,它将 1 存储在 char 中,由于 1 既不是 m 也不是 S,它会再次循环,然后放置 0,再次循环,放置另一个 0,依此类推。
我的理解是,当它看到整数存储在字符中时它会失败,但显然它没有失败。
我的问题是:
- 为什么输入没有失败?如果有人输入字符串或数字失败,我该如何更改它?
输入没有失败,因为'1'
是一个字符。数字是字符的子集。
读成std::string
.然后测试该字符串是否由所需范围内的单个字符组成。
但请注意,使用 >>
读取字符串时会停在第一个空格处。要防止这种情况并改为阅读整行,请使用 std::getline()
阅读。
我假设fillingStatus
是char
类型。
现在,即使您输入数字"1"或"0",它也会被读作字符。 因此,cin 不会失败。它只是根据您的代码继续循环。
此外,在读取无效字符时,应小心清除输入缓冲区,因为返回字符 '' 与输入缓冲区中的其他字符一起保留。
我会像下面这样做:
while ( !(cin >> fillingStatus) || (filingStatus != 'm' && filingStatus != 's') ) {
cout << "Error, please enter either m or s!" << 'n'; // error message
cin.clear(); // clear the error flag
cin.ignore(numeric_limits<streamsize>::max(), 'n'); // ignore all invalid previous input
}
一种方法是将fillingStatus
更改为string
并仅获取该字符串的第一个字符,然后查看它是否失败。
或者,曾经有一种获取字符输入的方法,getche()
我认为(我已经在C++工作了很多年了,所以不记得了)......你也许也可以使用它。
谢谢
由于您一次只读取一个字符,因此您基本上无法分辨出用户输入了更多,并且它一直保持,直到您从输入流中读取更多。
使用string
一次读取一行数据,并让程序对该字符串作为一个整体做出反应将解决您的问题。
std::string filingStatus ;
while(!(cin >> filingStatus ) || ( filingStatus != "m" && filingStatus != "f") )
{
cin.clear();
std::cout << "Error, please enter either m or s!" << 'n';
};
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 如何在C++中确定文本文件中的元素是字符还是数字
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存