为什么这个程序有效
Why does this program work?
我最近写了一个程序,它接受输入的字符数据,测试它是否可接受(a-z,#标记输入的末尾(并将其放在一个堆栈中,然后测试它是否是一个回文。我本来希望一次输入一个字符,但是如果我输入一个以英镑结尾的字符串。工程。以下是一些相关代码:
char buffer;
bool pound_test = false;
bool palindrome = false;
bool keep_going = true;
stack<char> stack1, stack2, stack3;
string str = "";
cout << "Please enter a string, then end it with the pound sign. " << endl;
while(pound_test == false) {
cin >> buffer;
if((buffer >= 97) && (buffer <= 122))
{
stack1.push(buffer);
stack2.push(buffer);
str += buffer;
}
if((buffer >= 65) && (buffer <= 90)) {
buffer = buffer + 32;
stack1.push(buffer);
stack2.push(buffer);
str += buffer;
}
if(buffer == '#')
pound_test = true;
}
因此,当用户输入一个长字符串(如"racecar#"并按回车键(时,程序会正确地将其放入堆栈中。我的问题很简单:为什么?数据是否不必一次输入一个字符才能正常工作,因为 cin 本身就在循环中,循环必须重复才能将多个字符输入堆栈,对吗?谢谢!
编辑:感谢大家的回答/评论!快速而亲切的回复给我留下了深刻的印象。我肯定会再次使用这个网站。
大多数系统中的控制台输入(通过 cin
std::istream
对象(是行缓冲的。因此,当您为单个字符调用 cin::operator>>
时,该函数实际上不会返回,直到您按换行符(因为基础 I/O 系统在此之前不会向cin
提供数据(。在缓冲区之前输入的任何数据(包括<newline>
(都将被缓冲,随后对cin::operator>>
的调用将从缓冲区提供服务,直到缓冲区耗尽。
在本例中cin >> buffer
,其中buffer
属于 char
类型,确实会得到一个字符,但在此之前,控制台缓冲了整行,并将使用它来满足后续的控制台输入操作。
如果在调试器中单步执行代码,则操作可能会更清晰。
"系统"(操作系统、库,无论什么——取决于实现(吃掉来自输入的数据字符串,但你的程序逐个字符读取它。
虽然所有关于操作系统缓冲的答案都是正确的,但我认为这种混淆可以追溯到cin
的operator >> (char)
; 因为C++可以根据方法的参数类型重载方法,所以 operator >>
的 char 版本一次只分配一个字符,即使整个字符串都被缓冲了。我相信你在想operator >>
应该尝试将整根弦融入你的角色中;但是由于它"知道"您一次正在阅读一个字符,因此它一次只分配一个字符。我不确定这是否是 cin 的指定行为,但这似乎是正在发生的事情。
cin
运算符从标准输入流中读取(如果未另行配置(。stdin
的工作原理如下:您键入并按 Enter
,它被发送到stdin
,因此cin
读取整个字符串,直到您按下 Enter
的那一刻。
如果你想逐个读取字符,你应该使用 getchar。
cin >> buffer;
看到键盘输入的方式不是程序的属性,而是操作系统、Shell、C 运行时的组合,也许还有我忘记的数千件事。
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- C++,在对象内分配多个数据时,堆栈分配是否更有效? 在下面的程序中,类A_Heap的效率会更低吗?
- SWIG和Mingw-64与Python一起使用...不是有效的 Win32 应用程序
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- 程序'main.exe'运行失败:指定的可执行文件不是此操作系统平台的有效应用程序
- 一个创建彩票游戏的程序,该彩票游戏可以有效地创建 10 套而没有任何重复?
- 用于在程序结束后暂停程序的有效循环
- boost::asio 使用 post() 时没有调用处理程序,当直接调用函数时有效(io_context有工作)
- 为什么这个带有 mov 算术的有效程序集在使用本地变量时无法编译
- 程序在C++ Tutor中执行时有效,但在其他任何地方都不起作用
- 程序有效,但在 20-30 秒后随机关闭
- 更有效的方法来制作数字记忆程序
- LoadLibrary失败带有错误4250:此操作仅在应用程序容器的上下文中有效
- 如何有效地构建QT应用程序
- 当从一个应用程序调用时,在DLL方法中创建COM接口指针是有效的,但当从另一个应用软件调用时则无效
- 创建 COM 接口指针在开发计算机上有效,但会导致其他计算机上的应用程序崩溃
- Exe不是有效的win32应用程序,但在64位上运行
- 如何在程序崩溃后释放managedsharedmemory:在调试过程中使用哪些有效的技术
- 合并排序程序总是有效的,但有时会在最后说中止陷阱
- Visual Studio 2013 *.exe不是有效的Win32应用程序