gpt4 book ai didi

c++ - 为什么这个程序有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:25 27 4
gpt4 key购买 nike

我最近编写了一个程序,它接受输入的字符数据,测试它是否可以接受(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确实会得到一个字符,但在此之前控制台缓冲了一整行并将使用它来满足后续的控制台输入操作。

如果您在调试器中单步执行代码,您可能会更清楚操作。

关于c++ - 为什么这个程序有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022549/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com