c++ 用cin对弦乐很好

i1icjdpr  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(74)

我怎么才能在弦上做好好工作呢?
[this不是一个链接]

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

即使我输入一个数字而不是字符串,它仍然不起作用。

6jjcrrmo

6jjcrrmo1#

问题出现在if条件下。
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";

Here是指向上述代码工作示例的链接。

oogrdqng

oogrdqng2#

即使我输入数字而不是字符串,它仍然不起作用
不存在“输入数字而不是字符串”这样的事情。用户对数据类型没有任何控制权,代码读取的是字符串。
如果用户输入一个表示数字的字符串,则该字符串仍然是一个有效的字符串,并且cin仍然处于良好状态。
例如,可以在字符串上使用strtoi来查看它是否是一个数字。但这仍然是非常薄弱的验证逻辑。“C*7”不是一个数字,但你可能也不想接受它作为一个州/省的名字。应用一些规则来定义有效名称,数字输入将与所有其他垃圾沿着被阻止。

wnvonmuf

wnvonmuf3#

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

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

相关问题