使用 sstream 验证失败
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>>
函数 returns 对流的引用,然后您可以执行类似
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);
}
见here for an example of the above。
当然也可以直接使用cin
:
int x;
while (!(cin >> x))
{
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
cout << "Please enter integer: \n";
}
测试变量是什么类型?一个字符串?
您可以尝试将字符串作为输入的通用解析器:
template<class T>
bool tryparse(const string word, T& res)
{
istringstream parser(word);
bool status = (parser >> res);
return status;
}
没有必要从 cin
流式传输到 string
,创建一个 istringstream
,然后从那里流式传输到您的号码:它只会为额外类型的错误留下空间,例如因为 "12x"
被视为 12
而 x
被忽略而不是为用户生成 warning/error 消息。
您可以通过以下方式直接阅读:
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 integer\n";
}
...use x...
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>>
函数 returns 对流的引用,然后您可以执行类似
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);
}
见here for an example of the above。
当然也可以直接使用cin
:
int x;
while (!(cin >> x))
{
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
cout << "Please enter integer: \n";
}
测试变量是什么类型?一个字符串? 您可以尝试将字符串作为输入的通用解析器:
template<class T>
bool tryparse(const string word, T& res)
{
istringstream parser(word);
bool status = (parser >> res);
return status;
}
没有必要从 cin
流式传输到 string
,创建一个 istringstream
,然后从那里流式传输到您的号码:它只会为额外类型的错误留下空间,例如因为 "12x"
被视为 12
而 x
被忽略而不是为用户生成 warning/error 消息。
您可以通过以下方式直接阅读:
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 integer\n";
}
...use x...