Что такое хороший способ зацикливания строк в многострочной строке? - PullRequest
7 голосов
/ 02 декабря 2011

Моя функция foo(char *str) получает str, то есть многострочную строку с символами новой строки, заканчивающимися нулем.Я пытаюсь написать цикл while, который перебирает строку и оперирует одной строкой.Каков хороший способ достижения этого?

void foo(char *str) {
    while((line=getLine(str)) != NULL) {
        // Process a line
    }
}

Нужно ли самому внедрять getLine или есть встроенная функция, чтобы сделать это для меня?

Ответы [ 4 ]

2 голосов
/ 02 декабря 2011

Вам нужно будет выполнить какой-то синтаксический анализ на основе символа новой строки самостоятельно. strtok () с разделителем "\ n" - это довольно хороший вариант, который делает что-то вроде того, что вы ищете, но его нужно использовать немного иначе, чем в вашем примере. Это было бы больше похоже на:

char *tok;
char *delims = "\n";
tok = strtok(str, delims);

while (tok != NULL) {
  // process the line

  //advance the token
  tok = strtok(NULL, delims);
}

Однако вы должны заметить, что strtok () является деструктивным и не безопасным для потоков.

1 голос
/ 11 ноября 2015

Оооо ... немного поздно, но ниже приведена повторная версия ответа @ debeer's и @Christian Rau - уведомление strtok_r вместо strtok. Это можно вызвать из нескольких потоков, используя разные строки.

char *tok;
char *saveptr;
char *delims = "\n";
tok = strtok_r(str, delims, &saveptr);

while (tok != NULL) {
  // process the line

  //advance the token
  tok = strtok_r(NULL, delims, &saveptr);
}

Обратите внимание, что он по-прежнему разрушителен, так как изменяет токенизируемую строку.

1 голос
/ 02 декабря 2011

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

void foo(char *str)
{
    char *line = strtok(str, "\n");
    while(line)
    {
        //work with line, which contains a single line without the trailing '\n'
        ...

        //next line
        line = strtok(NULL, "\n");
    }
}

Но имейте в виду, что это изменяет содержимое str (оно фактически заменяет '\n' s на '\0' s), поэтому вы можете захотеть сделать его копию заранее, если вам это понадобится в дальнейшем.

0 голосов
/ 02 декабря 2011

Вы можете использовать fgets для выполнения getLine работы: http://linux.die.net/man/3/fgets

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