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

时间:2013-08-30 18:54:37

标签: c++ buffer iteration iostream

以下是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())!='\0');
    return 0;
}

问题是以下输出: -

hello
hlo

hello
el

我知道为什么第一个输出会以它的方式出现,但第二个输出呢?另外,当我只按enter键一次时,为什么还有两个新行。我可以得到一些帮助吗?

4 个答案:

答案 0 :(得分:2)

第一次,cin.get()阻止do-while循环代码中的线程。 获得输入后,按Enter键,您会发现有2个换行符。这是因为do-while循环代码中的cin.get()已被阻止,当您按Enter键时,c将变为'\n'。接下来会发生什么cout.put('\n');

此时,您在do-while条件中cin.get()阻止了您的主题,因此您最终会跳过h,第一个l和{{1} }。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

对于这个问题,应该牢记两个关键点。这些是: -

  1. 当我们在字符串末尾按return键时,它也是 存储在缓冲区中并与所有存储的字符一起推送 在它上面的标准输出。
  2. 输出取决于是偶数还是奇数 字符串中的字符(包括return键)
  3. 输入字符串hello!并点击return。然后,我们再次输入hello!并点击return键。在这两种情况下,字符的总数(在任何一种情况下)都是7而不是6。在这种情况下,输出为: -

    hello!
    hlo
    
    hello!
    el!_
    

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

    现在,如果您点击return键一次,则会return两次,因为一旦输入return,另一次就是输出。