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

时间:2018-11-19 08:52:27

标签: c++ cin

在我的C ++类简介中,我们被要求编写一个函数,该函数使用指针返回字符串的长度。我编写的代码(请参见下面的完整代码)似乎可以正常工作,但这是我不明白的事情。

我认为在控制台中键入“是”,然后按Ctrl-Z(我使用的是Windows 10)会停止输入。但是,在按Ctrl-Z-> Enter之后,控制台仍在等待进一步的输入。我必须在“是”之后重新开始一行,按Ctrl-Z,然后再次按Enter键以停止输入。

为什么会这样?仅按Ctrl-Z之后不带任何两个新行,是否可以停止输入?

我在此处阅读了有关cin的几篇文章,包括thisthisthis,但它们似乎并没有回答我的问题。

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

unsigned strlen(const char *str)
{
    int count = 0;
    while (*str != '\0') { 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;
}

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

while (cin >> *pchar) pchar++;说,在stdin没有遇到错误的情况下继续从cin获取输入(或者在!cin.fail() == true期间是特定的)。

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

其次,我们必须了解导致std::istream::fail返回true的原因。 Here表示std::istream::fail返回true,如果设置了badbitfailbit标志(和/或还有任何发生EOF错误。

话虽如此,Ctrl-Z实际上是EOF(文件末尾)。根据我在上面所说的,如果发生任何 EOF错误,std::istream::fail将返回true,如果发生EOF,则返回false。 / p>

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

如果您确实想让程序在EOF / Ctrl-Z被击中时停止执行,则将循环调整为类似这样的方式...

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

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

我希望能完全回答您。