2016-11-09 82 views
0

如何這個程序應該工作的結束:C++:讀取多個輸入只行

輸入4個字:

這是不好的

錯誤輸入。

輸入4個字:

你好,你喜歡它

良好的輸入。

我怎麼試了一下:

#include <iostream> 
#include <string> 

using namespace std; 

int main(void) { 
    cout << "Enter 4 words:" << endl; 
    string a, b, c, d; 
    cin >> a >> b >> c >> d; 
} 

這行結束後讀取輸入,我無法弄清楚如何限制它只能一條線。你能指出我應該使用什麼功能嗎?我會非常感謝每一個答案。

謝謝大家!

+5

知道關於['的std :: getline'](http://en.cppreference.com/w/cpp/string/basic_string/getline)和['的std :: istringstream'](HTTP ://en.cppreference.com/w/cpp/io/basic_istringstream)應該會有所幫助。 –

回答

1

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的道路將會越來越容易。

0

應使用以下命令: std::getline() 這忽視了最終的空間,報價終止字符串,也可以將該值存儲在變量中,然後看看有多少話是內部的。 實施例: std::getline (std::cin,name);