2013-01-09 69 views
0

我正在嘗試構建一個程序,該程序以相反順序輸出輸入,直到輸入「停止」字樣。 例如,如果我進入以相反的順序打印字符串輸入

dog cat monkey 
desk chair 
burger cheese ham 
stop 

應該輸出:

burger cheese ham 
desk chair 
dog cat monkey 

到目前爲止,我有以下幾點:

{ 
string x, y; 
do { 
    cin >> x; 
    y = y + x; 
} while (x != "stop"); 

int reverse = y.getNumLines(); 

while (reverse >= 0) { 
    cout << y.getLine(reverse) << "\n"; 
    reverse = reverse -1; 
} 
return 0;  
} 

它正確地讀我的投入,但對於y.getNumlinesy.getLine,我得到沒有輸出的錯誤。 任何人都可以幫我嗎?

+1

'y'不是簡單的'矢量'嗎?你知道這兩個函數不存在字符串嗎? –

+0

抱歉,我還沒有矢量圖的知識。 – user1940749

+0

它是否必須「停止」?文件結尾往往會更好地處理所有事情。如果你是在要求它的話,記住這一點。 – chris

回答

3

爲什麼不交換您所追加的訂單?

#include <iostream> 

int main(int argc, const char * argv[]) 
{ 

    std::string x, y; 
    while ((std::getline(std::cin,x)) && x != "stop"){ 
     y = x + "\n" + y; // "" + "foo bar" 2.) "second input" + "foo bar" 
    } 

    std::cout<< y; 

    return 0; 
} 
+0

這將輸出「停止」。一個簡單的解決方法是while((std :: cin >> x)&& x!=「stop」)'。另一個問題是它需要在新行上打印,這需要以最簡單的形式「std :: getline」。 – chris

+0

只是指出了添加中的邏輯錯誤,而不是修復他的代碼:p – Nico

+0

好吧,有'y.getLine'部分。唯一的問題是它不存在。 – chris

2

尼科的答案可能是一個更好的路徑給你,但對於那些誰喜歡比較慣用的方式,我建議你可以輕鬆地打印向後一旦存儲線的向量。的第一件事將是一個Line類,你可以用它來閱讀習慣用法,而不是在空間停止輸入線:

struct Line { 
    std::string str; 
}; 

std::istream &operator>>(std::istream &in, Line &line) { 
    std::getline(in, line.str); 

    if (line.str == "stop") { 
     in.clear(std::ios::failbit); 
    } 

    return in; 
} 

std::ostream &operator<<(std::ostream &out, const Line &line) { 
    out << line.str; 
    return out; 
} 

我們所有的Line需求與實際的文本字符串,我已經添加了輸入和爲它輸出支持,因爲你接下來會看到。注意輸入是通過getline而不是>>。這是Line課程的主要目的。輸入「停止」後,我也失敗了。如果沒有,它會繼續讀取直到EOF。

現在,您可以用最小的努力重新使用線類,以便根據需要對輸入進行形狀修改。接下來,我們去使用我們剛剛創建(或可能從別的東西離開了):

int main() { 
    std::istream_iterator<Line> in1(std::cin), in2; 
    std::vector<Line> inputs(in1, in2); 
    std::reverse_copy(std::begin(inputs), std::end(inputs), std::ostream_iterator<Line>(std::cout, "\n")); 
} 

我們做的第一件事是形成通過讀取輸入(使用Line我們的輸入支持)的向量。當到達文件末尾或輸入「停止」時,它將停止,並且每一行輸入都將很好地存儲在我們的向量中。接下來,我們將reverse_copy複製到我們的向量(每行輸入)到標準輸出,由換行符分隔,但全部向後完成,因此我們以相反的順序結束每行。

就是這樣!一旦生成了Line類,獲取行輸入和反轉它們的算法可以保持不變,就好像我們用單詞進行操作一樣,但切換到行只需要用Line替換std::string的幾個實例。

+0

用戶表示他不知道矢量。這暗示用戶的班級尚未被教導如何進行班級。 – Nico

+0

@Nico,我意識到這一點。這就是爲什麼我在開始時給你的答案建議你的答案。這對於那些對類和算法有更多瞭解並希望實現這一目標的未來訪問者來說更是如此。 – chris

相關問題