防止C++中我的行末打印额外的空格

4

我正在通过输入接收数据

string input,word;
while(getline(cin, input)) {
 stringstream ss; 
 ss<<input
 while(ss >> word)
 ...

我想打印我需要的内容,使用cout <<word<<" ";。然而,这样做会在每行末尾创建一个额外的空格,我不希望出现这种情况。如果我不加空格,那么打印出来的单词之间就没有空格了。有没有更简单的方法可以让我自动添加空格?有哪些方法可以防止每行末尾的额外空格?

类似于这个:https://stackoverflow.com/questions/35858896/c-compare-and-replace-last-character-of-stringstream/35859132#35859132 和这个:https://stackoverflow.com/questions/36137997/convert-vectorunsigned-char-1-2-3-into-string-1-2-3-as-digits/36138229#36138229 - Galik
2
现在你是把空格放在单词后面。你可以通过在 while 循环之外打印第一个单词,然后在每个单词之前打印空格来解决这个问题。单独处理第一个单词将避免前导空格。 - aquirdturtle
std::getline 不适用于这个吗? - Random Davis
@RandomDavis:问题出在输出,而不是输入。 - Remy Lebeau
3个回答

5

在循环外测试第一个单词的提取,然后继续带有前导空格的循环:

std::string input;
while(getline(std::cin, input))
{
    std::istringstream ss(input);
    std::string word;
    if (ss >> word)
    {
        std::cout << word;
        while (ss >> word)
            std::cout << ' ' << word;
        std::cout << '\n';
    }
}

注意:为了完成一行,已添加换行符。请自行使用或删除。
提示:newline指的是换行符,通常用于文本中换行。在代码中,也常常使用\n表示换行。

这种方法只适用于某些情况,因为我想要做的事情的本质如此。假设我只需要在读入的输入是“;”时创建新行,如果我得到的输入由多行组成,每行只有一个单词而不是“;”,那么我需要将它们打印在一行中,并在每个单词之间加上一个空格。如果我这样做,所有这些单词之间都没有空格。 - Gui Montag
@GuiMontag 这种方法完全适用于您的问题描述。如果您需要其他内容,那么问题应该反映出来。在您的评论中,“假设我需要...只有当...”中,“只有当”的存在构成了额外的布尔检查和其中的操作。这些检查只需要转换为代码即可。 - WhozCraig

2

将问题反过来考虑。不是在单词后添加空格,而是找出何时应在单词前添加空格。

我的做法是将前缀分隔符初始化为空值,然后在第一个元素之后将其设置为有效值。在你的情况下,应该像这样:

const char *delimiter= "";
while(ss >> word)
{
    ss >> delimiter >> word;
    delimiter= " ";
}

谢谢,伙计。我认为你的解决方案通过了我的大部分测试。 - Gui Montag

0
一个技巧 - 仍然有点令人沮丧 - 是在混合中添加一个布尔变量:
bool space = false;
while (ss >> word) {
    if (space) {
         cout << " ";
    } else {
         space = true;
    }

    cout << word;
}

很遗憾,第二个示例不起作用。它表现出相同的问题。 - Galik
我尝试了第一种方法,但是我遇到了同样的问题。虽然我不确定为什么会这样。循环难道不应该在输入停止后停止吗? - Gui Montag
@Galik,感谢您的移除。@Gui Montag,您应该将此代码作为替换您的 while(ss >> word),并且在读取输入时不应有任何区别... - coyotte508

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接