cin.get()和cin.put()的行为

Behaviour of cin.get() and cin.put()

本文关键字:cin get put      更新时间:2023-10-16

下面是C++中的一段代码,它将一个字母作为输入并将其作为输出。此连续直到不按下Ctrl+C,即^C

#include<iostream>
using namespace std;
int main(void)
{
    char c;
    do
    {
        c = cin.get();
        cout.put(c);
    }while((c = cin.get())!='');
    return 0;
}

问题在于以下输出:-

hello
hlo
hello
el

我知道为什么第一个输出是这样的,但第二个呢?另外,当我只按一次enter键时,为什么会有两条新行。我能得到一些帮助吗?

第一次,cin.get()在do-while循环代码中阻塞线程。输入后,按enter键,会出现2个换行符。这是因为do-white循环中的cin.get()代码一直处于阻塞状态,当您按enter键时,c将变为'n'。接下来发生的是cout.put('n');

此时,do-white条件中的cin.get()阻塞了线程,因此最终会跳过h、第一个lo

查看循环条件-每次循环迭代调用cin.get()两次。将缺失的字符与''进行比较并丢弃。

正如您所知,cin.get()在循环中被调用两次,而cin.put(c)只被调用一次。由于您键入了两次hello,每次跳过一个字符,因此输出的字符序列为:(跳过的字符在括号中):h (e) l (l) o(h) e (l) l (o)

这个问题需要记住两个关键点。这些是:-

  1. 当我们按下字符串末尾的return键时,它也是存储在缓冲区中,并与存储的所有字符一起推送在标准输出中
  2. 输出取决于是否存在偶数或奇数字符串中的字符(包括return键)

假设输入了字符串hello!并且命中了return。然后,我们再次输入hello!并按下return键。在这两种情况下,字符总数(在任何一种情况下)都是7,而不是6。在这种情况下,输出为:-

hello!
hlo
hello!
el!_

其中CCD_ 28表示将被显示的光标。这是因为do-while循环中的cin.get()命令读取了第一个字符串之后的return键,因此打印了它。之后,控件转到do-while条件,并读取第二个字符串的h。这就是h没有打印在第二个输出中的原因。然后显示每个偶数字符。这就是打印!的原因。之后,CCD_ 36键被暂停在CCD_ 38位置执行的CCD_ 37条件检测到。

现在,如果按一次return键,就会得到两次return,因为一次输入return,另一次是输出。