2009-10-12 8 views
0

Мне нужна эффективная функция, которая извлекает первую секунду и остальную часть предложения в три переменные.Как эффективно извлечь слова из предложения?

+1

Это дубликат - http://stackoverflow.com/questions/1483206/how-to-tokenize-string-to-array-of-int-in-c/ - но не точный – ChrisF

+0

"на диске" является одно слово или два слова? – sambowry

+1

Это всего лишь один символ –

ответ

10

Легкий способ: Используйте strtok() или strtok_r, чтобы получить первые два маркера, которые будут удалять их из строки, так что сама строка будет ваш третий маркер, который вы искали.

Трудный путь: Разбираем сами :(

Strtok в библиотеке строки C, и будет мутировать вашей исходной строки, поэтому будьте осторожны, скопируйте строку первой, если она должна оставаться неповрежденной

Возможно. Пример:

//#include <string.h> 

char input[] ="first second third forth"; 
char delimiter[] = " "; 
char *firstWord, *secondWord, *remainder, *context; 

int inputLength = strlen(input); 
char *inputCopy = (char*) calloc(inputLength + 1, sizeof(char)); 
strncpy(inputCopy, input, inputLength); 

firstWord = strtok_r (inputCopy, delimiter, &context); 
secondWord = strtok_r (NULL, delimiter, &context); 
remainder = context; 

printf("%s\n", firstWord); 
printf("%s\n", secondWord); 
printf("%s\n", remainder); 

getchar(); 
free(inputCopy); 

Это должно работать нормально и быть поточно с исходной строкой немутированного

+0

Еще одна проблема заключается в том, что strtok() использует внутреннюю статическую переменную, поэтому она не является потокобезопасной. Используйте strtok_r(), если это проблема. –

+0

Очень верно, изменился пример использования strtok_r –

+2

Это дает мне первый токен в напоминании, а не оставшееся предложение. –

3
+1

@ BartłomiejSemańczyk Собственно, если вы вынимаете ссылку, она все еще говорит 'strtok', так что это еще ответ. – MicroVirus

+0

@ BartłomiejSemańczyk Я ответил на это в 09, ссылка все еще работает! –

2

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

+0

+1 'sscanf()' будет работать хорошо, так как я ожидаю, что слова «означают« что-то не пустое », что упрощает спецификатор преобразования и должно избегать всех проблем с' strtok() 'и друзьями. –