Вопрос по строкам
Доброе утро, у меня есть код, который считаем частоту встречаемости слова в строке, но я не могу понять для чего нужен while. Объясните пожалуйста. Вот код:
#include "stdio.h"
#include "string.h"
#define STR_SIZE 300
#define DELIM " ,.!?:;()\t\n"
int main()
{
char *words[100];
int nWords = 0;
char str[STR_SIZE] = "", *p = NULL, *pp = NULL;
printf("Text: ");
fgets(str, STR_SIZE, stdin);
p = strtok_s(str, DELIM, &pp);
while (p && nWords < 100)
{
words[nWords++] = p;
p = strtok_s(NULL, DELIM, &pp);
}
for (int i = 0; i < nWords; i++)
{
int k = 0;
for (int j = 0; j < nWords; j++)
{
if (j == i)
{
k = 1;
}
else if (strcmp(words[i], words[j]) == 0)
{
if (j < i)
break;
else
k++;
}
}
if (k > 0)
printf("%-15s: %d\n", words[i], k);
}
}
Ответы (1 шт):
Начать можно с того, что функция strtok_s находит следующий токен в строке байтов с завершающим нулем, на которую указывает str. Символы-разделители идентифицируются строкой байтов с завершающим нулем, на которую указывает разделитель. (отсюда). То есть, по сути, ищет следующее слово в строке и, в Вашем случае, кладёт указатель на это слово в переменную p. Если слов больше нет, в p кладётся NULL.
Теперь, чтобы Вам было немного понятнее, перепишу цикл более подробно (мой код делает то же самое, что и Ваш, просто операции более разделены):
p = strtok_s(str, DELIM, &pp);
while ((p != NULL) && (nWords < 100)) // Пока слова не закончились и найдено меньше 100 слов
{
words[nWords] = p; // Кладём очередное слово в массив
nWords++; // Наращиваем колчисетво найденных слов
p = strtok_s(NULL, DELIM, &pp); // В p кладём указатель на следующее слово или NULL, если слова закончились
}
То есть цикл ищет все слова (максимум 100) и складывает их в массив words.