在C++中通过换行符拆分字符串

3
如果我有两个存储在std :: string变量中的表格,如何将它们并排显示?特别是... 我有一个包含以下内容的std :: string table1:
 X | Y
-------
 2 | 3
 1 | 3
 5 | 2

我有一个std::string table2,其中包含以下内容:

 X | Y
-------
 1 | 6
 1 | 1
 2 | 1
 3 | 5
 2 | 3

我需要修改它们(或者只是将它们打印到标准输出),以便显示以下内容:
 X | Y    X | Y
-------  -------
 2 | 3    1 | 6
 1 | 3    1 | 1
 5 | 2    2 | 1
          3 | 5
          2 | 3

换句话说,我有两个存储在std::string变量中的表格,行之间用换行符分隔。 我想使用std::cout将它们打印到屏幕上,使表格并排显示,顶部垂直对齐。 我该怎么做呢?例如,如果我能够执行std::cout << table1.nextToken('\n')这样的操作,其中nextToken('\n')给出下一个标记,标记由'\n'字符分隔,那么我可以设计一种方法循环遍历所有标记,一旦使用了table1的所有标记,我就可以简单地打印空格字符,以便正确水平对齐table2的剩余标记。 但是,这样的nextToken(std::string)函数不存在,至少我不知道。

1
请参考这个问答Boost.StringAlgo - Mankarse
1个回答

5

关键词:istringstream,getline

实现:

#include <iostream>
#include <sstream>
int main()
{
    std::string table1 = 
        " X | Y\n"
        "-------\n"
        " 2 | 3\n"
        " 1 | 3\n"
        " 5 | 2\n";
    std::string table2 = 
        " X | Y\n"
        "-------\n"
        " 1 | 6\n"
        " 1 | 1\n"
        " 2 | 1\n"
        " 3 | 5\n"
        " 2 | 3\n";

    std::istringstream streamTable1(table1);
    std::istringstream streamTable2(table2);
    while (!streamTable1.eof() || !streamTable2.eof())
    {
        std::string s1;
        getline(streamTable1, s1);
        while (s1.size() < 9)
            s1 += " ";
        std::string s2;
        getline(streamTable2, s2);
        std::cout << s1 << s2 << std::endl;
    }
}

1
不要将空格添加到s1中,尝试使用std::cout << std::left << std::setw(9) << s1 << s2 << std::endl;。需要包含iomanip头文件。 - Bee

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