如何在不使用结尾的分隔符的情况下从字符串构建逗号分隔的列表?

问题描述

所以我正在尝试做这样的事情:

输入:

hi my name is clara

预期输出

hi,my,name,is,clara

我的程序如下:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{

    string str;

    getline(cin,str);

    istringstream ss(str);
    do {
        string word;
        ss >> word;
        cout << word << ",";
    } 
    while (ss);
}

但是输出看起来像这样

hi,clara,

有人可以帮我解决这个问题吗?

解决方法

这应该解决它:

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

using namespace std;

int main() {

    string str;

    getline(cin,str);
    
    string word;
    istringstream ss(str);
    bool firstIteration = true;
    while(ss >> word) {
        if(!firstIteration) {
            cout  << ",";
        }
        cout << word;
        firstIteration = false;
    };
}

请检查正在运行的演示here


我在许多编程语言中使用了这个惯用法(模式?),在所有类型的任务中,您都需要从列表(如输入)构造定界输出。让我用伪代码给出摘要:

empty output
firstIteration = true
foreach item in list
    if firstIteration
        add delimiter to output
    add item to output
    firstIteration = false

在某些情况下,甚至可以完全省略firstIteration指标变量:

empty output
foreach item in list
    if not is_empty(output)
        add delimiter to output
    add item to output
,

如果您希望每次执行while循环时都没有if子句的解决方案。

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

using namespace std;

int main() {

    string str;

    getline(cin,str);
    
    string word;
    istringstream ss(str);
    string delimiter = "";
    while(ss >> word) {
        cout << delimiter << word;
        delimiter = ",";
    };
}
,

一旦到达operator>>的末尾istringstream无法读取单词,从而使word变量为空,您将无法处理。您正在输出word,然后检查读取是否实际成功。这就是为什么您在输出的末尾以空白词结尾的原因。您需要检查该情况,例如:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    string str;
    getline(cin,str);

    istringstream ss(str);

    do {
        string word;
        if (!(ss >> word)) break;
        cout << word << ",";
    } 
    while (true);
}

或者:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    string str;
    getline(cin,str);

    istringstream ss(str);
    string word;

    while (ss >> word)
    {
        cout << word << ",";
    } 
}

但是,无论哪种方法,最后一个单词的末尾仍会带有逗号。

可以使用变量来控制何时输出逗号,例如:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    string str;
    getline(cin,str);

    istringstream ss(str);
    string word;
    bool first = true;

    while (ss >> word)
    {
        if (first)
            first = false;
        else
            cout << ",";

        cout << word;
    } 
}

但是,在这种情况下,简单地自己输出第一个单词,然后进入循环以输出其余以逗号为前缀的单词会更干净,例如:

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main()
{
    string str;
    getline(cin,str);

    istringstream ss(str);
    string word;

    if (ss >> word)
    {
        cout << word;

        while (ss >> word)
        {
            cout << "," << word;
        }
    } 
}