char *到std :: string的子串

时间:2011-08-15 14:59:05

标签: c++ arrays string

我有一个char数组,我需要提取这个数组的子集并将它们存储在std::string中。我试图基于找到\n字符将数组拆分成行。解决这个问题的最佳方式是什么?

int size = 4096;
char* buffer = new char[size];
// ...Array gets filled
std::string line;
// Find the chars up to the next newline, and store them in "line"
ProcessLine(line);

可能需要这样的界面:

std::string line = GetSubstring(char* src, int begin, int end);

5 个答案:

答案 0 :(得分:8)

我会创建std::string作为第一步,因为拆分结果会容易得多。

int size = 4096;
char* buffer = new char[size];
// ... Array gets filled
// make sure it's null-terminated
std::string lines(buffer);

// Tokenize on '\n' and process individually
std::istringstream split(lines);
for (std::string line; std::getline(split, line, '\n'); ) {
   ProcessLine(line);
}

答案 1 :(得分:5)

您可以使用std::string(const char *s, size_t n)构造函数从C字符串的子字符串构建std::string。传入的指针可以是C字符串的中间位置;它不需要是第一个角色。

如果您需要更多,请更新您的问题,详细说明您的绊脚石的确切位置。

答案 2 :(得分:1)

你最好的选择(最好的意思是最简单)是使用strtok并通过构造函数将标记转换为std::string。 (请注意,纯strtok不可重入,因为您需要使用非标准strtok_r)。

void ProcessTextBlock(char* str)
{
    std::vector<std::string> v;
    char* tok = strtok(str,"\n");
    while(tok != NULL)
    {
        ProcessLine(std::string(tok));
        tok = strtok(tok,"\n");
    }
}

答案 3 :(得分:1)

我没有意识到你只想一次处理一行,但为了防止你一次需要所有行,你也可以这样做:

std::vector<std::string> lines;

char *s = buffer;
char *head = s;
while (*s) { 
  if (*s == '\n') { // Line break found
    *s = '\0'; // Change it to a null character
    lines.push_back(head); // Add this line to our vector
    head = ++s;
  } else s++; // 
}
lines.push_back(head); // Add the last line

std::vector<std::string>::iterator it;
for (it = lines.begin(); it != lines.end(); it++) {
  // You can process each line here if you want
  ProcessLine(*it);
}
// Or you can process all the lines in a separate function:
ProcessLines(lines);

// Cleanup
lines.erase(lines.begin(), lines.end());

我已经修改了缓冲区,vector.push_back()方法自动从每个生成的C子串生成std :: string对象。

答案 4 :(得分:0)

您可以使用std :: string的构造函数将char *的子字符串转换为std :: string:

template< class InputIterator >
basic_string( InputIterator first, InputIterator last, const Allocator& alloc = Allocator() );

做一些像:

char *cstr = "abcd";
std::string str(cstr + 1, cstr + 3);

在那种情况下,str将是“bc”。