strtok () и пустые поля - PullRequest
       14

strtok () и пустые поля

4 голосов
/ 04 марта 2010

Я сериализую некоторую структуру C в строку и затем десериализую ее с помощью strtok(). Но, к сожалению, strtok() не обнаруживает пустых полей (например, 1: 2 :: 4).

Есть ли альтернативная функция?

Ответы [ 3 ]

9 голосов
/ 04 марта 2010

В Linux есть strsep .

Была введена функция strsep () в качестве замены для strtok (), так как последний не может обращаться с пустым поля. Тем не менее, strtok () соответствует C89 / C99 и, следовательно, является более портативным.

6 голосов
/ 04 марта 2010

Вы можете использовать strchr (только для одного символа разделителя) или strcspn (для группы возможных разделителей), чтобы найти следующий разделитель, обработать токен, а затем просто переместитесь на один символ вперед. Делайте это в цикле, и у вас есть то, что вам нужно.

0 голосов
/ 12 мая 2015

Дракоша дал правильный ответ. Я хочу добавить пример для обоих вариантов.

Со стрток:

char *token;
char *tmp_string;
char delimiter[10] = " |,.:";
strcpy (tmp_string, "1:2::4");
token = strtok(tmp_string, delimiter); // first token
while(token != NULL) {
    i++;
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token);
    // do something
    token = strtok(NULL, delimiter); /* next token */
}

С помощью strsep (распознает ""):

char *token;
char *tmp_string;
char delimiter[10] = " |,.";
strcpy (tmp_string, "1:2::4");
token = strsep(&tmp_string, delimiter); // first token
while(token != NULL) {
    i++;
    printf ("i=%d\tToken: len(%d)\t%s", i, strlen(token), token);
    // do something
    token = strsep(&tmp_string, delimiter); /* next token */
}
...