【问题标题】:Is this a good practice to check user input? [closed]这是检查用户输入的好习惯吗? [关闭]
【发布时间】:2017-05-08 23:35:42
【问题描述】:
do {
    std::cout << "Enter a valid name" << std::endl;
    std::cin >> name;

} while (!validName(name) && std::cout << "It is not a valid name" << std::endl);

如果名称无效,那么我以这种方式回复一行,这是一个好习惯吗?

【问题讨论】:

  • 总是需要检查输入是否成功,例如使用while (std::cin &gt;&gt; name) { ... }。如果对name 构成有效输入有进一步的限制,也应该检查这些限制。
  • @ChrisK: “第一个使用 using 命名空间 std;所以你不必总是添加 std” 嗯,理想情况下完全相反。

标签: c++ while-loop cin cout ostream


【解决方案1】:

在循环本身内进行检查和输出可能更清楚。您可以通过打破无限循环或继续一次性循环来做到这一点。例如:

do {
    std::cout << "Enter a valid name" << std::endl;
    std::cin >> name;
    if (!validName(name)) {
        std::cout << "It is not a valid name" << std::endl;
        continue;
    }
} while (false);

或者反过来:

for ( ;; ) {
    std::cout << "Enter a valid name" << std::endl;
    std::cin >> name;
    if (validName(name))
        break;

    std::cout << "It is not a valid name" << std::endl;
}

我通常更喜欢第二种,因为它可以很容易地注入一个计数器,所以如果循环体失败超过一定次数,你可以做一些其他类型的错误处理。

for (int attempt = 0; attempt < 3; ++attempt) {
    std::cout << "Enter a valid name" << std::endl;
    std::cin >> name;
    if (validName(name))
        break;

    std::cout << "It is not a valid name" << std::endl;
}

if (!validName(name)) {
    std::cout << "Failed to get a valid name after 3 tries" << std::endl;
    std::abort();
}

【讨论】:

    猜你喜欢
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2016-06-27
    • 2013-03-30
    • 1970-01-01
    • 2020-11-06
    相关资源
    最近更新 更多