【问题标题】:Why Ctrl+Z invalidates following Enter (\n) in cin.ignore(INT_MAX, '\n')? (input validation)为什么 cin.ignore(INT_MAX, '\n') 中的 Enter (\n) 后 Ctrl+Z 无效? (输入验证)
【发布时间】:2020-08-19 09:35:48
【问题描述】:

我想验证double 键盘输入:

  1. 如果输入是double,程序应该正常继续。
  2. 如果输入不是double(包括Ctrl+Z),程序应清除流状态并忽略所有剩余输入,直到下一个\n 才能接收新输入。

所以我写了这段代码:

#include "std_lib_facilities.h"

int main()
{
    double val{};

    cout << "Please enter a 'double' value:\n";

    while (!(cin>>val))
    {   
        cout << "ERROR: That is not a valid entry. Please try again\n";
        cin.clear();
        cin.ignore(INT_MAX, '\n');
    }

    cout << val << "\n\n";

    keep_window_open();
    return 0;
}

我有 2 个问题:(我想只使用 cin 和 cout 来解决这个问题。)

  1. 当用户输入 Ctr+Z 并按 Enter(与 '\n' 相同)时,cin.ignore(INT_MAX, '\n'); 会一直等待输入 '\n'。如果在 Ctrl+Z 之后已经有一个 Enter(或 \n),为什么会发生这种情况?

  2. 此代码不包括我的条目,例如:98ssssssssss。它将采用 98 值,并且 ssssssss 将保留在流中。如何改进代码,使其将其识别为错误条目?

【问题讨论】:

  • 第 2 部分的答案很简单,而且您应该始终以这种方式完成此类任务。 1) 将输入读取为 string,2) 检查字符串的内容是否符合您对双精度的期望。 3)如果是则将字符串转换为double,否则报错。

标签: c++ validation


【解决方案1】:

Ctrl+Z 取决于您正在运行的机器/平台(例如,在某些机器上,如果我没记错的话,它是 Ctrl+D)。一般来说,'\n' 与输入的所谓“行尾”并不完全相同。即使 cout 语句末尾的 '\n' 也最好用 &lt;&lt;endl; 语句替换,因为输出可能由于某种原因被缓存并且不会立即打印出来。 正如 john 所说,最好将输入作为字符串获取,然后对其进行所有必需的操作。

【讨论】:

  • 我使用的是 Windows 10,这里的 eof 是 Ctrl+Z。但是 '\n' 作为 cin.ignore 的参数包含在内。这意味着如果你发现 '\n' 你应该停止忽略。不管 \n 不是“行尾”,它肯定等于 Enter。因为例如当我按下一个字母时,它会将最后的输入识别为 \n 并停止忽略。
猜你喜欢
  • 2019-02-12
  • 2013-09-09
  • 2017-07-19
  • 2022-12-14
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
相关资源
最近更新 更多