Подстрока char * в std :: string - PullRequest
       2

Подстрока char * в std :: string

2 голосов
/ 15 августа 2011

У меня есть массив 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 ]

8 голосов
/ 15 августа 2011

Я бы создал 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);
}
5 голосов
/ 15 августа 2011

Вы можете использовать конструктор std::string(const char *s, size_t n) для построения std::string из подстроки строки C.Указатель, который вы передаете, может быть в середине строки C;это не обязательно должен быть самый первый символ.

Если вам нужно больше, пожалуйста, обновите свой вопрос, чтобы подробно указать, где находится ваш камень преткновения.

1 голос
/ 15 августа 2011

Я не осознавал, что вы хотите обрабатывать каждую строку по одной, но на тот случай, если вам нужны все строки одновременно, вы также можете сделать это:

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 () автоматически генерирует объекты std :: string из каждой из результирующих подстрок C.

1 голос
/ 15 августа 2011

Ваша лучшая ставка (лучшая в смысле самая легкая) использует 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");
    }
}
0 голосов
/ 15 августа 2011

Вы можете превратить подстроку char * в std :: string с помощью конструктора 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".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...