开发者

Substring of char* to std::string

I have an array of chars and I need to extract subsets of this array and store them in std::strings. I am trying to split the array into lines, based on finding the \n character. What is the best way to approach this?

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

Probably need some kind of interface like this:

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


I'd create the std::string as the first step, as splitting the result will be far easier.

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);
}


You can use the std::string(const char *s, size_t n) constructor to build a std::string from the substring of a C string. The pointer you pass in can be to the middle of the C string; it doesn't need to be to the very first character.

If you need more than that, please update your question to detail exactly where your stumbling block is.


I didn't realize you only wanted to process each line one at a time, but just in case you need all the lines at once, you can also do this:

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());

I've modified the buffer in place, and the vector.push_back() method generates std::string objects from each of the resulting C substrings automatically.


your best bet (best meaning easiest) is using strtok and convert the tokens to std::string via the constructor. (just note that pure strtok is not reentrant, for that you need to use the non standard 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");
    }
}


You can turn a substring of char* to std::string with a std::string's constructor:

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

Just do something like:

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

In that case str would be "bc".

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜