我最近编写了一个程序,它接受输入的char数据,测试是否可以接受(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#”并按下回车键时,程序会正确地将其放入堆栈中。我的问题很简单:为什么?数据是否必须一次输入一个char以使其正常工作,因为cin本身就在循环中,并且循环必须重复以将多个字符输入堆栈,对吧?谢谢!
编辑:感谢大家的回答/评论!快速而善意的回复让我印象深刻。我肯定会再次使用这个网站。
答案 0 :(得分:4)
大多数系统中的控制台输入(通过cin
std::istream
对象)都是行缓冲的。因此,当您为单个字符调用cin::operator>>
时,该函数实际上不会返回,直到您按下换行符(因为基础I / O系统在此之前不会使数据可用于cin
)。所有输入到的数据(包括<newline>
)都将被缓冲,后续对cin::operator>>
的调用将从缓冲区提供服务,直到用完为止。
在这种情况下cin >> buffer
,其中buffer
的类型为char
,确实会得到一个字符,但在此之前,控制台缓冲整行并将使用它来满足后续控制台输入操作。
如果您在调试器中单步执行代码,则操作可能会更清晰。
答案 1 :(得分:3)
“系统”(操作系统,库,等等 - 取决于实现)吃了来自输入的数据字符串,但是你的程序用char读取它。
答案 2 :(得分:2)
虽然关于os缓冲的所有答案都是正确的,但我认为混淆可以追溯到cin
的{{1}};因为C ++可以根据它们的参数类型重载方法,所以operator >> (char)
的char版本一次只分配一个字符,即使整个字符串是缓冲的。我相信你会认为operator >>
应该试着将整个字符串放入你的角色;但由于它“知道”你一次只读一个字符,所以它一次只能分配一个字符。我不确定这是否是针对cin的指定行为,但这似乎正在发生的事情。
答案 3 :(得分:0)
cin
运算符从标准输入流中读取(如果没有另外配置)。 stdin
的工作方式如下:您输入内容,当您按Enter
时,它会发送到stdin
,因此cin
会读取整个字符串,直至您按下{ {1}}。
如果您希望通过char读取char,则应使用getchar。
答案 4 :(得分:0)
cin >> buffer;
看到键盘输入的方式不是程序的属性,而是OS,Shell,C运行时的组合,也许是我忘记了的千件事。