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



在我的C++类简介中,我们被要求编写一个函数,该函数使用指针返回字符串的长度。我写的代码(见下面的完整代码(似乎工作得很好,但有一点我不明白。

我认为在控制台中键入"是",然后键入Ctrl-Z(我使用的是Windows 10(会停止输入。但是,在按下Ctrl-Z->Entertrl-Z,然后再次按Enter停止输入。

为什么会出现这种情况?在没有两条新行的情况下按下Ctrl-Z后,是否有方法停止输入?

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

#include "pch.h"
#include <iostream>
using namespace std;
unsigned strlen(const char *str)
{
int count = 0;
while (*str != '') { 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;
}

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

你必须连续按两次;或者在换行后按它;以导致出现文件结束条件。

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

另请参阅:为什么我需要多个EOF(CTRL+Z(字符?

首先,我们必须了解while循环的实际功能。

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

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

其次,我们必须了解是什么原因导致std::istream::fail返回true。这里他们说,如果设置了badbitfailbit标志(和/或如果发生任何EOF错误(,则std::istream::fail返回true

话虽如此,Ctrl-Z实际上是EOF(文件结束(。根据我上面所说的,如果发生任何noneEOF错误,std::istream::fail将返回true,当然,如果发生EOF,则返回false

简而言之,EOF/Ctrl-Z是否导致std::istream::fail返回true,因此循环将继续运行。

如果你真的想让你的程序在EOF/Ctrl-Z被击中时停止执行,那么把你的循环调整成这样。。。

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

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

我希望这能完全回答你。

最新更新