簡體   English   中英

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

[英]Behaviour of cin.get() and cin.put()

以下是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鍵時,為什么會有兩個新行。 我可以幫忙嗎?

第一次, cin.get()阻塞了do-while循環代碼中的線程。 輸入后,按Enter鍵,發現出現兩個換行符。 這是因為do-while循環代碼中的cin.get()已被阻止,並且在您按Enter鍵時, c將變為'\\n' 接下來發生的是cout.put('\\n');

此時,在do-while條件下您的cin.get()阻塞了您的線程,因此最終跳過了h ,前一個lo

查看循環條件-每個循環迭代兩次調用cin.get() 將缺少的字符與'\\0'進行比較並丟棄。

如您所知, cin.get()在循環中被調用兩次,而cin.put(c)僅被調用一次。 由於您鍵入了兩次hello ,並且每次都跳過一個字符,因此輸出的字符序列為:(跳過的字符在括號中): h (e) l (l) o (h) e (l) l (o)

對於此問題,應牢記兩個關鍵點。 這些是:-

  1. 當我們按字符串末尾的return鍵時,它也存儲在緩沖區中,並與存儲在其中的所有字符一起推入標准輸出中。
  2. 輸出取決於字符串中是否包含en偶數或奇數個字符(包括return鍵)

說的字符串hello! 輸入並點擊return 然后,我們再次hello! 然后按return鍵。 在這兩種情況下,字符總數(無論哪種情況)均為7而不是6 在這種情況下,輸出為:

hello!
hlo

hello!
el!_

其中_表示將要顯示的光標。 這是因為在do-while循環中cin.get()命令讀取了第一個字符串之后的return鍵命中,因此將其打印出來。 之后,控件進入do-while條件,並讀取第二個字符串的h 這就是h未在第二個輸出中打印的原因。 之后,將顯示每個偶數字符。 這就是原因! 打印。 之后, do-while條件會檢測到return鍵,該條件會暫停_位置的執行。

現在,如果您按一次return鍵,您將獲得兩次return ,因為一次輸入了return ,而另一次則是輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM