在我的C ++类简介中,我们被要求编写一个函数,该函数使用指针返回字符串的长度。我编写的代码(请参见下面的完整代码)似乎可以正常工作,但这是我不明白的事情。
我认为在控制台中键入“是”,然后按Ctrl-Z(我使用的是Windows 10)会停止输入。但是,在按Ctrl-Z-> Enter之后,控制台仍在等待进一步的输入。我必须在“是”之后重新开始一行,按Ctrl-Z,然后再次按Enter键以停止输入。
为什么会这样?仅按Ctrl-Z之后不带任何两个新行,是否可以停止输入?
我在此处阅读了有关cin的几篇文章,包括this,this和this,但它们似乎并没有回答我的问题。
#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;
}
答案 0 :(得分:2)
如果在键入其他文本后按Ctrl-Z,它将刷新行缓冲区(它不会设置文件结束条件)。
您必须连续按两次;或在换行符后按它;导致文件结束条件的发生。
您的误解与Windows控制台的行为有关,而与C ++流本身无关。
答案 1 :(得分:1)
首先,我们必须了解while循环的实际作用。
while (cin >> *pchar) pchar++;
说,在stdin
没有遇到错误的情况下继续从cin
获取输入(或者在!cin.fail() == true
期间是特定的)。
请注意,cin
基本上是std::istream
的对象。
其次,我们必须了解导致std::istream::fail
返回true
的原因。
Here表示std::istream::fail
返回true
,如果设置了badbit
或failbit
标志(和/或还有任何非发生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字符,请继续循环。否则就停止循环。
我希望能完全回答您。