从使用sstream读取的单词中删除最后一个空格的最佳方法是什么?

时间:2015-06-03 05:38:57

标签: c++ stringstream

所以,我的代码应该在不改变它们在输入上出现的顺序的情况下加扰句子的单词。代码工作正常,但在输出的末尾有一个空格,导致演示错误。

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() {
    string line;
    while(getline(cin,line)){
        stringstream ss(line);
        string word;
        while(ss>>word){
            string sWord;
            for(int i=word.length()-1;i>=0;i--) {
                sWord+=word.at(i);
            } 
            cout << sWord << " ";
        } 
    cout << endl;
    }
}

这是由cout << sWord << " ";行引起的,无论单词的位置如何,都会打印一个空格。我试图将这部分代码重写为:

cout << sWord;
if(ss>>word) cout << " "; // if there is a following word, print the space; else don't

但是因为我再次写ss>>word,所以当下一次迭代开始时,它会从第3个字(或第5个,第7个等)开始,跳过我不想要的东西。

有没有一种简单的方法可以达到这个目的?

提前致谢!

3 个答案:

答案 0 :(得分:1)

您可以使用bool来测试您是否显示第一个字词,例如:

bool is_first = true; // bool flag to test whether first word or not 
while(ss>>word){
        string sWord;
        for(int i=word.length()-1;i>=0;i--) {
            sWord+=word.at(i);
        }
        if(is_first){ // first word
            cout << sWord;
            is_first = false;
        }
        else{ // not first word
            cout << " " << sWord;
        }
} 

通过这种方式,您可以在每次迭代时有效地打印" " << sWord;,但第一次迭代除外,您不输出空格。

答案 1 :(得分:0)

我更多地提出更多内容:

$country_id = $country['country_id'];
foreach($all_district[$country_id] as $district)
{
     echo $district['district_name'];
}

一个额外的,但它只会一次。代码重复,但这是一个非常小的块。

答案 2 :(得分:0)

考虑在实际单词前面附加空格:

int main () {
    string line;
    while(getline (cin, line)) {
        stringstream ss (line);
        string word;
        bool first = true;
        while(ss >> word) {
            if(first) {
                first = false; //skip the space for the first word
            } else cout << " ";
            string sWord;
            for(int i = word.length () - 1; i >= 0; i--) {
                sWord += word.at (i);
            }
            cout << sWord;
        }
        cout << endl;
    }
}