对字符串使用cin.good

  • 本文关键字:cin good 字符串 c++
  • 更新时间 :
  • 英文 :


如何使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;
            }
        }

它是用于检查状态是否有效的容器。

最新更新