【问题标题】:Splitting strings by newline character in C++在 C++ 中按换行符拆分字符串
【发布时间】:2013-05-31 23:24:13
【问题描述】:

如果我有两个表存储在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) 函数不存在——至少我不知道。

【问题讨论】:

标签: c++ string cout iomanip


【解决方案1】:

关键词:字符串流、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;
    }
}

【讨论】:

  • 不要给 s1 添加空间,试试std::cout &lt;&lt; std::left &lt;&lt; std::setw(9) &lt;&lt; s1 &lt;&lt; s2 &lt;&lt; std::endl;。需要iomanip 头文件。
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2015-06-17
  • 2012-04-20
相关资源
最近更新 更多