为什么这个程序有效?

时间:2012-01-26 17:33:24

标签: c++ stack

我最近编写了一个程序,它接受输入的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本身就在循环中,并且循环必须重复以将多个字符输入堆栈,对吧?谢谢!

编辑:感谢大家的回答/评论!快速而善意的回复让我印象深刻。我肯定会再次使用这个网站。

5 个答案:

答案 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运行时的组合,也许是我忘记了的千件事。