使用流失败的验证
validation using sstream failing
cout << "nPlease enter x-ordinate: ";
cin >> test;
stringstream ss(test);
ss >> x;
while(ss.fail())
{
ss.str("");
cin.clear();
cin.ignore(256, 'n');
cout << "Please enter integer: n";
cin >> test;
stringstream ss(test);
ss >> x;
cout << x << ss;
}
嗨,我正在尝试通过使用 sstream 检查它是否可以转换为整数 x 来测试用户的输入是否为整数,但是一旦我输入一个有效的整数,while 循环仍然被证明是正确的,循环继续。阿诺酮能帮忙吗?
你的代码有一个小问题...您有两个名称完全不同的变量,一个用于循环条件,一个在循环主体内部。这两个变量没有任何关系或联系。
而是通过设置其字符串来重用第一个ss
变量:
...
cin >> test;
ss.str(test);
...
您也不会清除循环中ss
流的状态,只会清除cin
,这就是循环永远不会结束的原因。
我还建议您使用流可以用作布尔条件的事实,并且operator>>
函数返回对流的引用,然后您可以执行以下操作:
cout << "nPlease enter x-ordinate: ";
getline(cin, test);
istringstream ss(test);
while(!(ss >> x))
{
ss.clear();
cout << "Please enter integer: n";
getline(cin, test);
ss.str(test);
}
有关上述示例,请参阅此处。
当然,也可以直接使用cin
:
int x;
while (!(cin >> x))
{
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), 'n');
cout << "Please enter integer: n";
}
有关上述示例,请参阅此处。
从cin
流式传输到string
是没有意义的,创建一个istringstream
,然后从那里流式传输到您的号码:它只是为其他类型的错误留出了空间,例如"12x"
被视为12
并且忽略x
而不是为用户生成警告/错误消息。
您可以直接阅读以下内容:
const char* prompt = "nPlease enter x-coordinate: ";
while (cout << prompt && !(cin >> x))
{
cin.clear();
cin.ignore(256, 'n');
prompt = "Please enter integer: n";
}
如果不需要更改提示,可以直接将其放入循环中:
while (cout << "nPlease enter x-coordinate: " && !(cin >> x))
{
cin.clear();
cin.ignore(256, 'n');
std::out << "Please enter an integer.n";
}
注意:你会看到一些类似于你的第一次努力的东西,其中对string
的读取使用getline
而不是>>
,这可能是一个很好的做法,因为它可以让你计算行号(对于解析文件比std::cin
更有用)和检查值出现在其他预期数据的行上。 它看起来像这样:
std::string line;
while (std::cout << "Enter coordinate:" &&
getline(std::cin, line))
{
std::istringstream iss(line);
if (iss >> x)
break;
std::cout << "Error - invalid coordinate, please enter an integern";
}
...use x...
测试变量是什么类型?您可以尝试将字符串作为输入的通用解析器:
template<class T>
bool tryparse(const string word, T& res)
{
istringstream parser(word);
bool status = (parser >> res);
return status;
}
相关文章:
- LibGit2 SSH身份验证失败
- boost::p rogram_options - 验证失败时,显示用户在错误消息中输入的值
- vkCreatePipeline 失败,验证层段错误
- Windows 套接字和身份验证构建在包含 Poco-Library 时失败
- 在Java中生成RSA签名,但在C 中验证签名失败
- MFC对话框数据验证失败时还原数据
- 如果将键定义为std :: string,则存储在REDIS中的POD结构的验证将失败
- 证书验证在客户端服务器通信中使用boost :: asio和openssl失败
- 使用流失败的验证
- 由于SSL3_GET_CLIENT_CERTIFICATE:未返回证书,验证 SSL 客户端真实性失败
- 输入验证循环在第一次输入失败后无法正常工作
- if(!buydat.empty()) 验证失败(始终为 true)
- 正则表达式验证失败,而 egrep 验证正常
- 获取POCO HTTPSClientSession发送请求时出错-证书验证失败
- 使用Objective-C和C++实现X-FACEBOOK-PLATFORM身份验证失败
- 验证器的断言失败
- XML验证在调试时失败,在发布时有效
- WACK测试在Windows运行时元数据验证上失败
- 服务器证书验证失败.CAfile: ca.pem CRLfile:无
- 基于epoll的服务器失败(相互身份验证)