C++ C++;逐行拆分字符串

C++ C++;逐行拆分字符串,c++,split,C++,Split,我需要把绳子一行一行地分开。 我以前是这样做的: int doSegment(char *sentence, int segNum) { assert(pSegmenter != NULL); Logger &log = Logger::getLogger(); char delims[] = "\n"; char *line = NULL; if (sentence != NULL) { line = strtok(sentence, delims); while(li

我需要把绳子一行一行地分开。 我以前是这样做的:

int doSegment(char *sentence, int segNum)
{
assert(pSegmenter != NULL);
Logger &log = Logger::getLogger();
char delims[] = "\n";
char *line = NULL;
if (sentence != NULL)
{
    line = strtok(sentence, delims);
    while(line != NULL)
    {
        cout << line << endl;
        line = strtok(NULL, delims);
    }
}
else
{
    log.error("....");
}
return 0;
}
int-doSegment(字符*句子,int-segNum)
{
断言(pSegmenter!=NULL);
Logger&log=Logger::getLogger();
字符delims[]=“\n”;
char*line=NULL;
if(句子!=NULL)
{
行=strtok(句子,delims);
while(行!=NULL)
{
cout您可以在循环中调用并使用

std::vector split_string(const std::string&str,
常量std::字符串和分隔符)
{
std::向量字符串;
std::string::size\u type pos=0;
std::string::size\u type prev=0;
while((pos=str.find(delimiter,prev))!=std::string::npos)
{
字符串。向后推(str.substr(prev,pos-prev));
上一个=位置+1;
}
//获取最后一个子字符串(或仅当未找到分隔符时)
字符串。推回(str.substr(prev));
返回字符串;
}

请参见示例。

我想使用std::getline或std::string::find遍历字符串。 下面的代码演示了getline函数

int doSegment(char *sentence)
{
  std::stringstream ss(sentence);
  std::string to;

  if (sentence != NULL)
  {
    while(std::getline(ss,to,'\n')){
      cout << to <<endl;
    }
  }

return 0;
}
int doSegment(字符*句子)
{
std::stringstream ss(句子);
std::字符串到;
if(句子!=NULL)
{
while(std::getline(ss,to,'\n')){
不能包含
#包括
#包括
#包括
#包括
使用名称空间std;
向量拆分器(字符串格式、字符串和内容){
矢量分割内容;
正则表达式模式(in_模式);
复制(sregex_令牌_迭代器(content.begin(),content.end(),pattern,-1),
sregex_令牌_迭代器(),返回插入器(拆分内容));
返回拆分内容;
}
int main()
{   
string语句=“这是第一行\n”;
句子+=“这是第二行\n”;
句子+=“这是第三行\n”;
矢量线=拆分器(R“(\n)”,句子);

对于(string-line:lines){cout这种效率相当低的方法只是在字符串中循环,直到遇到换行符。\n然后创建一个子字符串并将其添加到向量中

std::vector<std::string> Loader::StringToLines(std::string string)
{
    std::vector<std::string> result;
    std::string temp;
    int markbegin = 0;
    int markend = 0;

    for (int i = 0; i < string.length(); ++i) {     
        if (string[i] == '\n') {
            markend = i;
            result.push_back(string.substr(markbegin, markend - markbegin));
            markbegin = (i + 1);
        }
    }
    return result;
}
std::vector Loader::StringToLines(std::string)
{
std::向量结果;
std::字符串温度;
int-markbegin=0;
int-markend=0;
对于(inti=0;i
std::vector split\u string\u by\u newline(const std::string&str)
{
自动结果=标准::向量{};
auto-ss=std::stringstream{str};
for(std::string line;std::getline(ss,line,'\n');)
结果:推回(线);
返回结果;
}

我建议使用C++来查看STD::GETLIN,你需要对输入进行一些修改。不要拆分函数。要小心<代码> Strtok < /Cord>,因为它修改了你传递给它的字符串。还有一个问题。我不确定String流是否需要关闭。它是局部变量,如果从DOGEGMED中退出,它将自行破坏。如果您使用的分隔符有多个字符,就像我一样,您需要将“prev=pos+1;”行更改为“prev=pos+delimiter.size();”相反。否则,你将在向量中下一个元素的开头留下剩余字符。虽然此代码片段可能是解决方案,但确实有助于提高你的文章质量。请记住,你是在为将来的读者回答这个问题,而那些人可能不知道你的代码错误的原因GISEAN。这个代码在C++或C++ 11中不起作用。“错误:对于STD太多的初始化器::StrugSt流”{AKA’STD::“Y.YXCXX11::Basic StrugStudio } }”你可以在这里检查它的工作。这对C++ 11来说是有效的。
#include <iostream>
#include <string>
#include <regex>
#include <algorithm>
#include <iterator>
    
using namespace std;


vector<string> splitter(string in_pattern, string& content){
    vector<string> split_content;

    regex pattern(in_pattern);
    copy( sregex_token_iterator(content.begin(), content.end(), pattern, -1),
    sregex_token_iterator(),back_inserter(split_content));  
    return split_content;
}
    
int main()
{   

    string sentence = "This is the first line\n";
    sentence += "This is the second line\n";
    sentence += "This is the third line\n";

    vector<string> lines = splitter(R"(\n)", sentence);

    for (string line: lines){cout << line << endl;}

}   
std::vector<std::string> Loader::StringToLines(std::string string)
{
    std::vector<std::string> result;
    std::string temp;
    int markbegin = 0;
    int markend = 0;

    for (int i = 0; i < string.length(); ++i) {     
        if (string[i] == '\n') {
            markend = i;
            result.push_back(string.substr(markbegin, markend - markbegin));
            markbegin = (i + 1);
        }
    }
    return result;
}