簡體   English   中英

以相反的順序打印字符串輸入

[英]Printing string inputs in reverse order

我正在嘗試構建一個程序,以相反的順序輸出輸入,直到輸入單詞“ stop”為止。 例如,如果我輸入

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 ,我得到沒有輸出的錯誤。 誰能幫我嗎?

為什么不交換您要追加的訂單?

#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;
}

Nico的答案可能對您來說是一條更好的途徑,但是對於那些喜歡使用更慣用的方法的人,我建議使用行向量,一旦存儲起來就可以輕松地向后打印。 第一件事是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。

現在,您可以輕松地重用line類,以便根據需要調整輸入的形狀。 接下來,我們將使用我們剛創建的(或可能已從其他內容中刪除的內容):

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實例。

暫無
暫無

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

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