簡體   English   中英

為什么std :: cin不從頭開始讀取

[英]why is std::cin not reading from the start

我在看一個涉及std::cin如何工作的問題。 這是一個問題:

如果在要求您輸入時鍵入以下兩個名稱(例如Samuel Beckett),以下程序會做什么?

#include <iostream>
#include <string>

int main() {

    std::cout << "What is your name? ";
    std::string name;
    std::cin >> name;
    std::cout << "Hello, " << name << std::endl << "And what is yours? ";

    std::cin >> name;
    std::cout << "Hello, " << name << std::endl << "; nice to meet you too!" << std::endl;

    return 0;
}

我期望輸出為:

What is your name? Samuel Beckett
Hello, Samuel
And what is yours? Hello, Samuel
; nice to meet you too!

但是輸出是:

What is your name? Samuel Beckett
Hello, Samuel
And what is yours? Hello, Beckett
; nice to meet you too!

任何人都可以幫忙, std::cin如何工作?

我知道如果我這樣做:

    std::string a, b;
    std::cin >> a >> b;

並輸入兩個單詞,那么a將有第一個單詞, b將有第二個單詞,但是為什么會這樣呢? 不是std::cin應該首先丟棄所有空白,然后讀取字符直到到達另一個空白????

任何幫助深表感謝。

流提取器( >> )是由空格分隔的-讀取時,遇到任何空格時它將停止。 下次使用時,它將從中斷處開始讀取。 如果只想在換行符上定界,則可以使用cin.getline()代替。

編輯:來自@Pete Becker的更正。

如果在要求您輸入時鍵入以下兩個名稱(例如Samuel Beckett),以下程序會做什么?

當遇到空格時(除其他情況外), operator>>停止讀取。 因此,對>>的第一次調用僅返回Samuel ,將Beckett留在輸入緩沖區中,以便對>>的下一次調用返回。 這正是您所看到的情況。

我知道如果我這樣做:

 std::string a, b; std::cin >> a >> b; 

並輸入兩個單詞,則a將具有第一個單詞,b將具有第二個單詞。

兩者之間沒有任何區別

std::cin >> a >> b;

std::cin >> a;
std::cin >> b;

在第一種情況下, operator>>返回對要讀取的流的std::istream&引用,該引用允許將多個操作鏈接在一起。 但是,同樣的操作也可以在單獨的語句中完成。

不是std :: cin應該首先丟棄所有空白,然后讀取字符直到到達另一個空白????

不是std::cin本身,而是operator>> ,但是是的,這正是這里發生的情況。

暫無
暫無

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

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