为什么这个程序有效

Why does this program work?

本文关键字:有效 程序 为什么      更新时间:2023-10-16

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

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

"系统"(操作系统、库,无论什么——取决于实现(吃掉来自输入的数据字符串,但你的程序逐个字符读取它。

虽然所有关于操作系统缓冲的答案都是正确的,但我认为这种混淆可以追溯到cinoperator >> (char); 因为C++可以根据方法的参数类型重载方法,所以 operator >> 的 char 版本一次只分配一个字符,即使整个字符串都被缓冲了。我相信你在想operator >>应该尝试将整根弦融入你的角色中;但是由于它"知道"您一次正在阅读一个字符,因此它一次只分配一个字符。我不确定这是否是 cin 的指定行为,但这似乎是正在发生的事情。

cin运算符从标准输入流中读取(如果未另行配置(。stdin的工作原理如下:您键入并按 Enter ,它被发送到stdin,因此cin读取整个字符串,直到您按下 Enter 的那一刻。

如果你想逐个读取字符,你应该使用 getchar。

cin >> buffer;看到键盘输入的方式不是程序的属性,而是操作系统、Shell、C 运行时的组合,也许还有我忘记的数千件事。

相关文章: