while (cin >> *pchar) 在 Ctrl-Z 之后等待进一步输入

while (cin >> *pchar) awaits further input after Ctrl-Z

在我的 C++ 简介 类 中,我们被要求编写一个使用指针 returns 字符串长度的函数。我编写的代码(请参阅下面的完整代码)似乎工作得很好,但这是我不明白的地方。

我想输入 'Yes' 然后输入 Ctrl-Z(我使用的是 Windows 10 ) 在控制台中将停止输入。但是,在按下 Ctrl-Z -> Enter 后,控制台仍会等待进一步的输入。我必须在 'Yes' 之后另起一行,按 Ctrl-Z 然后按 Enter 再次停止输入。

为什么会这样?有没有办法在只按 Ctrl-Z 而没有任何两个新行后停止输入?

我在这里阅读了几篇关于 cin 的帖子,包括 this, , and ,但它们似乎没有回答我的问题。

#include "pch.h"
#include <iostream>
using namespace std;

unsigned strlen(const char *str)
{
    int count = 0;
    while (*str != '[=10=]') { str++; count++; }
    return count;
}

int main()
{
    char str[100] = {};
    char *pchar;
    pchar = str;
    while (cin >> *pchar) pchar++;
    pchar = str;
    cout << '\n' << strlen(pchar);
    return 0;
}

首先我们必须了解你的 while 循环实际上做了什么。

while (cin >> *pchar) pchar++; 表示继续从 stdin 获取输入,而 cin 没有遇到错误(或者具体地说 !cin.fail() == true)。

注意 cin 基本上是 std::istream 的对象。

那么其次我们要了解是什么导致std::istream::fail到returntrueHere 他们说 std::istream::fail returns true 如果设置了 badbitfailbit 标志(and/or 如果有的话 发生 EOF 错误。

话说回来,Ctrl-Z其实就是EOF(文件结尾)。根据我上面所说的,std::istream::fail 将 return true 如果发生任何 none EOF 错误,当然 return false 如果发生 EOF。

所以简而言之,EOF/Ctrl-Z 不是导致 std::istream::fail 到 return true 因此循环将继续 运行.

如果你真的想让你的程序在 EOF/Ctrl-Z 被击中时停止执行,然后调整你的循环是这样的...

 while ((cin >> *pchar) && !cin.eof()) pchar++;

现在上面的循环读取,而 std::istream::fail() == false and no EOF/Ctrl-Z字符已输入,继续循环。否则停止循环。

我希望这能完全回答你。

如果在键入其他文本后按 Ctrl-Z,它会刷新行缓冲区(它不会设置结束-文件条件).

必须连续按两次;或者在换行后按它;导致文件结束条件发生。

您的误解与 windows 控制台行为有关,而不是 C++ 流本身。

另请参阅:Why do I require multiple EOF (CTRL+Z) characters?