2011-08-21 3 views
2

следующий код разбивает команду строки с использованием пробела i.e "" и полной остановки, т. Е. "." Что делать, если я хочу разбить команду, используя появление как пробела, так и полной остановки (в то же время), а не каждый сам по себе, например. команда, как: «Привет .как ты» будет разбит на куски (игнорируя кавычки) [привет] [как вы сегодня]Строковый токенизатор в c

char *token2 = strtok(command, " ."); 
+0

Вам нужно либо написать свой собственный токенизатор, либо использовать сторонний генератор парсера/лексера (например, 'lex') или библиотеку (я знаю только библиотеку синтаксиса C++' boost :: spirit', а не любую библиотеку C). –

ответ

3

Вы можете сделать это довольно легко с strstr:

char *strstrtok(char *str, char *delim) 
{ 
    static char *prev; 
    if (!str) str = prev; 
    if (str) { 
     char *end = strstr(str, delim); 
     if (end) { 
      prev = end + strlen(delim); 
      *end = 0; 
     } else { 
      prev = 0; 
     } 
    } 
    return str; 
} 

Это в значительной степени точно так же, как реализация strtok, просто звоню strstr и strlen вместо strcspn и strspn. Он также может возвращать пустые токены (если есть два последовательных разделителя или разделитель с обоих концов); вы можете отказаться игнорировать их, если хотите.

3

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

Это общий вопрос, который вы задаете, но мне еще предстоит увидеть особенно элегантное решение. Вышеприведенное является простым и выполнимым.

Смежные вопросы