如何使cin.good也适用于字符串?
[这不是链接]
while (1)
{
cin.clear();
cin.sync();
cout << "n" << "Enter the state you are from" << endl;
cin >> s;
if (!cin.good())
{
cout << "n" << "Please the enter the correct form of your state :)" << endl;
}
else
{
break;
}
}
即使我输入了一个数字而不是字符串,它仍然不起作用。
问题处于if
条件下。
cin.good()如果从文件读取时出现问题、文件不存在等,则返回0
正如你帖子下面的评论中所说,输入1234作为整数仍将被视为"1234"。我认为最好的方法是遍历每个字符,检查它们是否是数字,如果它到达末尾,那么它就是一个数字。
string::const_iterator it = str.begin();
while(it != str.end() && isdigit(*it))
{
it++;
}
if (!str.empty() && it == str.end())
cout << "not a string";
else
cout << "valid";
这是上面代码的工作示例的链接。
即使我输入了一个数字而不是字符串,它仍然不能工作
不存在"输入数字而不是字符串"这样的东西。用户无法控制数据类型,代码读取字符串。
如果用户输入一个表示数字的字符串,则该字符串仍然是有效字符串,并且cin
仍将处于良好状态。
您可以在字符串上使用(例如)strtoi
来查看它是否是一个数字。但这仍然是非常薄弱的验证逻辑。"C*7"不是一个数字,但你可能也不想接受它作为州/省的名称。对有效名称的构成应用一些规则,数字输入将与所有其他垃圾一起被阻止。
cin
的工作就是获取数据。如果不能,它将设置.good()
、.fail()
、.eof
等标志。您可以在需要时进行检查。在这种情况下,它有一根绳子。不管你喜不喜欢这根绳子。
程序员可以使用其他代码来验证字符串是否有用,例如检查字符串是否与有效状态匹配。成功提供数据后,cin
不能决定数据的任何内容。这就像把打电话的人归咎于手机
如果所有状态都放在一个关联容器中:set
/unordered_set
/map
/unordered_map
,那么代码可能如下所示:
string msg="Enter the state you are from";
while (cin.good()) // make sure there is more to do.
{
cout << "n" << msg << endl;
string s;
cin >> s;
if (valid_states.contains(s)) {
break;
} else {
msg="Please the enter the correct form of your state :)" << endl;
}
}
它是用于检查状态是否有效的容器。