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;
}

关于c++ - C++ 流中的无效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512998/

相关文章:

c# - 在静态方法中管理一次性对象

c++ - C/C++ 结构,在缓冲区中包含位字段

c++ - 如何使用模板为 C++ 类创建 "calculated attribute"

c++ - 我怎样才能让它重复而不陷入无效输入?

c++ - 内部编译器错误 : Segmentation fault On Raspberry Pi

c++正确删除结构和指针

javascript - 使用 Bacon.JS 进行速率限制

java - java.util.stream.Collectors.toMap() 的值函数返回常量值

尝试流式传输 smb 文件时,Android App Chooser 不显示

c# - 在 C# 中的帧开头剪切和附加图像