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
到returntrue
。
Here 他们说 std::istream::fail
returns true
如果设置了 badbit
或 failbit
标志(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?
在我的 C++ 简介 类 中,我们被要求编写一个使用指针 returns 字符串长度的函数。我编写的代码(请参阅下面的完整代码)似乎工作得很好,但这是我不明白的地方。
我想输入 'Yes' 然后输入 Ctrl-Z(我使用的是 Windows 10 ) 在控制台中将停止输入。但是,在按下 Ctrl-Z -> Enter 后,控制台仍会等待进一步的输入。我必须在 'Yes' 之后另起一行,按 Ctrl-Z 然后按 Enter 再次停止输入。
为什么会这样?有没有办法在只按 Ctrl-Z 而没有任何两个新行后停止输入?
我在这里阅读了几篇关于 cin 的帖子,包括 this,
#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
到returntrue
。
Here 他们说 std::istream::fail
returns true
如果设置了 badbit
或 failbit
标志(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?