C ++从字符串中检索多行

时间:2018-10-08 19:54:16

标签: c++ string getline

我的一项工作涉及将几个字符串读入我的程序。我已经弄清楚了如何将字符串存储到一个字符串中,但是现在我需要逐行检索每个字符串。有什么建议么? 示例:

string s = "Hello
            Welcome
            Oranges
            Bananas
            Hi
            Triangle"

我也不允许将它们存储到数组中;它们必须全部包含在一个字符串中。

2 个答案:

答案 0 :(得分:1)

我可能会将字符串放入stringstream,然后使用类似std::getline的东西一次从字符串流中读取一行。如果您真的担心执行速度,可以使用更快的方法,但这将是显而易见的首选,直到性能分析告诉您这是不允许的。

关于它的价值,可以在字符串中嵌入换行符,可以使用\n,也可以切换为使用原始字符串文字:

string s = R"(Hello
              Welcome
              Oranges
              Bananas
              Hi
              Triangle)";

使用原始字符串文字,嵌入的换行符(以及其他任何内容)成为字符串本身的一部分。在普通的字符串文字中,您必须改为使用\n(如果您希望它是可移植的,那么无论如何)。

答案 1 :(得分:0)

要按原样呈现std::string内容,请使用raw string literal。以下代码将从原始字符串文字中检索所有单行:

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

int main() {
   std::string s = R"x(Hello
Welcome
Oranges
Bananas
Hi
Triangle (and hey, some extra stuff in the line with parenthesis)
)x"; 
    std::istringstream iss(s); 
    std::vector<std::string> lines; 
    std::string line; 
    while(getline(iss,line)) { 
        lines.push_back(line); 
    }
    for(const auto& line : lines) {
        std::cout << line << '\n';
    }
}

在线查看工作版本here


使用先前的c ++ 11标准,您必须使用\字符来避免换行符,如下所示:

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

int main() {
   std::string s = "Hello \n\
Welcome \n\
Oranges \n\
Bananas \n\
Hi  \n\
Triangle (and hey, some extra stuff in the line with parenthesis)"; 
    std::istringstream iss(s); 
    std::vector<std::string> lines; 
    std::string line; 
    while(getline(iss,line)) { 
        lines.push_back(line); 
    }
    for(std::vector<std::string>::const_iterator it = lines.begin(); it != lines.end(); ++it) {
        std::cout << *it << '\n';
    }
}

请参阅其他工作online example