流中的输入无效C++

  • 本文关键字:无效 C++ c++ stream
  • 更新时间 :
  • 英文 :


考虑以下代码,该代码采用整数输入,然后打印 cin 流状态:

#include <iostream>  
using namespace std;
int main()
{
    int number;
    cout<<"Enter a number n";
    cin>>number;
    cout<<cin.rdstate()<<endl;
    return 0;
}

如果输入的数字是"zzzz",则rdstate返回值4。
如果输入的数字是"10zzzz",则rdstate返回值0,数字的值为10,输入流中有"zzzz"。

我的问题是:
1. 为什么"10zzzz"的输入不被视为无效输入(至少应该设置一个故障位。
2.检测和处理这种情况的优雅解决方案是什么。

谢谢!!!

首先,

我想问一下你想做什么:

cout<<cin.rdstate()<<endl;

阅读此页面以正确使用 rdstate((http://www.cplusplus.com/reference/iostream/ios/rdstate/

第二:要检查输入是否是字符串类型或整数类型,您可能需要添加一些额外的内容,这会将输入字符串转换为整数数据,并在输入无效输入时

响应错误消息。

因此,这将帮助您:

int main() {
 string input = "";
 // How to get a string/sentence with spaces
 cout << "Please enter a valid sentence (with spaces):n>";
 getline(cin, input);
 cout << "You entered: " << input << endl << endl;
 // How to get a number.
 int myNumber = 0;
 while (true) {
   cout << "Please enter a valid number: ";
   getline(cin, input);
   // This code converts from string to number safely.
   stringstream myStream(input);
   if (myStream >> myNumber)
     break;
   cout << "Invalid number, please try again" << endl;
 }
 cout << "You entered: " << myNumber << endl << endl;
 // How to get a single char.
 char myChar  = {0};
 while (true) {
   cout << "Please enter 1 char: ";
   getline(cin, input);
   if (input.length() == 1) {
     myChar = input[0];
     break;
   }
   cout << "Invalid character, please try again" << endl;
 }
 cout << "You entered: " << myChar << endl << endl;
 cout << "All done. And without using the >> operator" << endl;
 return 0;
}

如果输入的数字是"zzzz",则rdstate返回值4。如果输入的数字是"10zzzz",则 rdstate 返回的值为0,数字的值为 10,输入流中包含"zzzz"。

要理解为什么会发生这种情况,我们需要了解提取运算符(operator>>(是如何工作的。这里有一些很好的链接可以开始:

std::cin 和处理无效输入

std::iStream::运算符>>

人们可以在以下地方进行更深入的挖掘:

运算符>>(标准::basic_istream(

std::basic_istream<CharT,Traits>::运算符>>

std::num_get<CharT,InputIt>::get, std::num_get<CharT,InputIt>::d o_get

简单来说,当写入算术类型时,只要字符序列可以精确地解释为该类型的值,就会逐个字符分析输入。当无法再这样做时,解析将停止,并使用在该点之前获得的有效值。

">

zzzz"没有提供有效值,而"10zzzz"允许解析10

就解决方案而言,可以改进 dennis 基于字符串流的答案以处理尾随字符,如下所示。 如果有尾随字符,!myStream.eof()的计算结果将为 true。

此外,除了使用字符串流之外,还有其他选项。例如,strtolstd::stoi

此外,在此上下文中使用输入字符串流而不是字符串流会更好。看这里。

相关内容

  • 没有找到相关文章

最新更新