2012-06-28 29 views
1

我有這段代碼,我發現將一個字符串切成單詞。 我無法弄清楚部分是如何工作的。它如何知道沒有空格地提取單詞到buf變量? 它似乎使用提取操作符(>>)來將位進入緩衝區,並且爲循環返回true - 我只是不知道如何知道如何通過空格刪除單詞。stringstream代碼分離單詞 - 這個東西是如何工作的?裏面的代碼片段

string buf; // Have a buffer string 
stringstream ss(str); // Insert the string into a stream 

vector<string> tokens; // Create vector to hold our words 

while (ss >> buf) 
    tokens.push_back(buf); 
+1

嗯... >>操作上調用的stringstream其副本的字節流,直到第一個空格,和這是在一個循環中完成的? – 2012-06-28 21:04:22

+0

我明白它的作用,無需爲我翻譯。我只是想知道,如何?在我從下面的答案中得到的鏈接中,似乎>>可以識別一些條件,但沒有提到空白。 – Zephyer

回答

4

std::operator>>,而不是位運算符,並且用來提取格式化的數據,在這種情況下std::string。它返回正在讀取的流的引用。

A stringstream由於其轉換operator void*()可以在布爾上下文中使用,允許將其用作循環中的終止條件。

+0

感謝您的評論。這不是我認爲確實是的運營商。布爾上下文現在也有意義。但是它對空白區域有何說法?只是好奇,以瞭解如何工作,即時通訊C++新手:) – Zephyer

+0

@Zephyer,正確的鏈接更新答案。 – hmjd

+0

現在很清楚,非常感謝! – Zephyer

5

我只是無法弄清楚它是如何知道通過空格削減的話

由於buf類型爲std::string,你需要閱讀的operator>>是左邊需要一個std::istream描述和一個std::string在右邊。

引述cppreference.com

字符被提取並追加到str直到:

N字符被讀取,其中Nis.width()如果is.width() > 0,否則Nstr.max_size()

一個EOF標記從is

isspace(c,is.getloc())對於is中的下一個字符是正確的。

這最後一句說,在英語中,「停,如果下一個字符是一個空間」

+0

是的,hmjd也修復了他到那個頁面的鏈接,我現在明白了。謝謝你:) – Zephyer

+0

過來想想看,那個頁面缺少一些信息,編輯。 – Cubbi