在我的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
。这里他们说,如果设置了badbit
或failbit
标志(和/或如果发生任何非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字符,继续循环。否则停止循环。
我希望这能完全回答你。