Разбор строки на слова
В данном примере, разделения строки на отдельные слова осуществляется определением места положения пробелов. Предполагается, что символы, расположенные между пробелами, составляют отдельное слово.
Извлечение последовательности символов начинаем с поиска пробела. Функция strchr возвращает указатель на первое вхождение пробела. Разница между найденным указателем и указателем на начало строки составит длину первого слова.
Приравниваем значение указателя end + 1 к указателю start, тем самым позиционируя начало поиска на новую позицию, пропуская найденный пробел.
Выполняем выделение всех последующих слов до последнего. Последнее слово не оканчивается пробелом, поэтому выделяем все символы до конца строки.
#include <
stdio.h>
#include <
string.h>
/**
* Функция выполняет разделение строки на слова.
* - указатель на исходную строку.
* Возвращаемое значение:
* нет.
*/
void parse_string(const char *str);
/* Основная функция */
int main()
{
const char *str = "Kazakhstan has presented its tourism opportunities at an international tourism exhibition in Moscow recently.";
parse_string(str);
return 0;
}
void parse_string(const char * str)
{
if (!strlen(str))
return;
char word[64] = { 0 };
const char *start = str; /* Указатель на начало слова. */
const char *end = nullptr; /* Указатель на конец слова. */
int number_of_words = 0;
do
{
end = strchr(start, ' '); /* Ищем первое вхождение пробела. */
if (end)
{
if ((end - start) >
1) /* Разница между адресами определяет
количество символов в слове. */
{
/* Копируем символы из промежутка определенного указателями. */
strncpy_s(word, end - start + 1, start, end - start);
printf("%2d - %s\n", ++number_of_words, word);
}
/* Перемещаем начальный указатель на еще не обработанный участок строки. */
start = end + 1;
}
else
{
/* Последнее слово не оканчивается пробелом, поэтому копируем все
символы до конца строки. */
strncpy_s(word, strlen(start) + 1, start, strlen(start));
printf("%2d - %s\n", ++number_of_words, word);
}
} while (end);
}