Мне нужна эффективная функция, которая извлекает первую секунду и остальную часть предложения в три переменные.Как эффективно извлечь слова из предложения?
ответ
Легкий способ: Используйте 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);
Это должно работать нормально и быть поточно с исходной строкой немутированного
Еще одна проблема заключается в том, что strtok() использует внутреннюю статическую переменную, поэтому она не является потокобезопасной. Используйте strtok_r(), если это проблема. –
Очень верно, изменился пример использования strtok_r –
Это дает мне первый токен в напоминании, а не оставшееся предложение. –
@ BartłomiejSemańczyk Собственно, если вы вынимаете ссылку, она все еще говорит 'strtok', так что это еще ответ. – MicroVirus
@ BartłomiejSemańczyk Я ответил на это в 09, ссылка все еще работает! –
Вы должны определить разграничить. сначала. Есть несколько проблем с strtok
(он изменяет свой аргумент, например, который может вызвать у вас неприятности). Я предпочитаю читать строку и запускать собственный парсер, который может варьироваться от sscanf
до полномасштабного синтаксического анализатора. Пожалуйста, напишите еще несколько деталей.
+1 'sscanf()' будет работать хорошо, так как я ожидаю, что слова «означают« что-то не пустое », что упрощает спецификатор преобразования и должно избегать всех проблем с' strtok() 'и друзьями. –
Это дубликат - http://stackoverflow.com/questions/1483206/how-to-tokenize-string-to-array-of-int-in-c/ - но не точный – ChrisF
"на диске" является одно слово или два слова? – sambowry
Это всего лишь один символ –