std::getline()
應該在程序的期望輸入來自交互式終端時使用。
這就是std::getline()
所做的:它讀取文本直到換行符。 operator>>
不這樣做,這就是std::getline()
所做的,這就是應該用來處理一行輸入文本的內容。使用正確的工具,做正確的工作。
可悲的是,許多C++書籍和教程介紹>>
太早,引入std::getline()
之前,並在他們的例子使用它,只是因爲它更簡單,更方便的>>
處理所需要的數據類型轉換。不幸的是,這導致了一個錯誤的思維定式,其中>>
被認爲是處理交互式輸入的自動選擇。不是這樣。
正確的做法是使用std::getline()
。然後,如有必要,構建一個std::istringstream
,並使用它來處理來自輸入輸入的任何類型轉換。這不僅解決了眼前的問題,而且解決了輸入不可分割的問題,使得輸入失敗的狀態變得失敗,隨後所有嘗試的輸入轉換都失敗了 - 這是另一個常見的錯誤。
因此,使用std::getline()
,第一:
#include <string>
#include <iostream>
#include <sstream>
#include <vector>
int main(void) {
std::cout << "Enter 4 words:" << endl;
std::string line;
std::getline(std::cin, line);
而現在,一旦輸入的文本行,它可以被轉換爲std::istringstream
:
std::istringstream i(line);
隨之而來的是循環反覆調用>>
以計算這一行中的單詞。這部分你可以完成自己。
P.S.另一個常見的陷阱是using namespace std;
。 You should not do that, as well。早期的良好編程實踐被獲得後,C++ guru-ism的道路將會越來越容易。
知道關於['的std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)和['的std :: istringstream'](HTTP ://en.cppreference.com/w/cpp/io/basic_istringstream)應該會有所幫助。 –