2015-04-20 2 views
2
char line[] = "COPY\tSTART\t0\tCOPY"; 
char *tmp; 

tmp = strtok(line, "\t"); 
printf("%s", tmp); 

Этот код выводит COPY. И когдаИдентификаторы парсеров из строки с использованием strtok()

char line[] = "\tSTART\t0\tCOPY"; 

Выход START.

Но! Я хочу проверить, что перед строкой START ничего нет. То есть я думаю, \t - это первый разделитель, поэтому выход strtok(line, "\t") - NULL. Но реальный выход START.

Есть ли недоразумения? Что я могу сделать?

+2

Неясно, что вы пытаетесь сделать? – Eregrith

+3

Разделитель, начинающийся с начала строки, будет пропущен. Вы можете получить '' '' 'С' strsep' вместо этого. – BLUEPIXY

ответ

3

В соответствии с man page из strtok()(курсив)

Последовательность из двух или более смежных разделителей байтов в строке разобранного считается один разделитель. Ошибки разделителя в начале или в конце строки игнорируются. Путь другой: токены, возвращаемые strtok(), всегда являются непустыми строками.

Итак, что вы испытываете, это правильное поведение strtok().

OTOH, strtok() вернет NULL, если больше нет токенов, так как вы ожидали, возврат NULL для исходного разделителя приведет к неправильному сообщению, и это будет путать. Таким образом, нижняя линия,

  • если маркер присутствует

    лексемы, возвращаемые strtok() всегда непустые строки.

  • если маркер нет

    strtok() возвратит NULL.

Примечание: это полезно отметить, что перед использованием retured маркера, всегда проверять NULL.

1

Что я могу сделать?

Создайте свою собственную функцию, не точно, как strtok работает, но вы можете получить некоторое представление:

#include <stdio.h> 
#include <string.h> 

char *scan(char **pp, char c) 
{ 
    char *s, *p; 

    p = strchr(*pp, c); 
    if (p) *p++ = '\0'; 
    s = *pp; 
    *pp = p; 
    return s; 
} 

int main(void) 
{ 
    char line1[] = "COPY\tSTART\t0\tCOPY"; 
    char line2[] = "\tSTART\t0\tCOPY"; 
    char *p; 

    puts("Line 1"); 
    p = line1; 
    while (p) { 
     printf("%s\n", scan(&p, '\t')); 
    } 
    puts("Line 2"); 
    p = line2; 
    while (p) { 
     printf("%s\n", scan(&p, '\t')); 
    } 
    return 0; 
} 

Выход:

Line 1 
COPY 
START 
0 
COPY 
Line 2 

START 
0 
COPY 
Смежные вопросы