无字母循环

The No-letter cycle

你能解释一下它是如何工作的吗,尤其是 while (!(cin >> n) || (cin.peek() != '\n')? 如果我输入数字(1,2,3..)它works.If我输入字母(a,b,c,d),它让我再输入一次。

while (!(cin >> n) || (cin.peek() != '\n'))
{
  cin.clear();
  cin.ignore(256, '\n');
  cout << "enter n ";
}

while 循环中的第一个条件

!(cin >> n)

检查输入是否成功

第二个条件

(cin.peek() != '\n')

输入后缓冲区是否包含换行符'\n'即用户是否按下回车键。

例如,如果缓冲区包含

123A\n

然后,如果读取整数类型的对象,则它可以获得值 123,并且第一个条件的计算结果为真,但正如您所见,输入通常是无效的。

所以这个 while 循环排除了这种情况,尽管如果用户在输入后附加一个空格,比如

123_\n

其中下划线表示空白,则此输入也将被拒绝。唯一有效的输入是

123\n

即循环要求用户输入一个数字后没有任何附加符号,然后按回车键。