0

以下是 C++ 中的代码,它将字母作为输入并将其作为输出。这种连续的直到不按Ctrl+Cie ^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

4 回答 4

2

第一次,cin.get()阻塞 do-while 循环代码中的线程。得到输入后,按回车键,您会发现出现了 2 个换行符。这是因为cin.get()do-while 循环里面的代码已经被阻塞了,当你按下回车时,c会变成'\n'. 接下来会发生什么cout.put('\n');

在这一点上,你cin.get()在 do-while 条件下阻塞了你的线程,所以你最终跳过了h、 firstlo.

于 2013-08-30T19:02:52.483 回答
1

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

于 2013-08-30T18:57:47.317 回答
0

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

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

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

hello!
hlo

hello!
el!_

where_表示将要显示的光标。这是因为循环中的命令return读取了第一个字符串之后的键,因此它被打印了。之后,控件进入条件并读取第二个字符串的。这就是没有在第二个输出中打印的原因。之后显示每个偶数字符。这就是打印的原因。之后,通过在该位置暂停执行的条件检测到密钥。cin.get()do-whiledo-whilehh!returndo-while_

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

于 2013-09-01T09:54:09.690 回答
0

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

于 2013-08-30T18:59:58.560 回答