Давайте перепишем код, чтобы он был менее лаконичным и более читабельным:
void tokenize(char *line, char **words, int *nwords)
{
*nwords=1;
words[0]=strtok(line," \t\n");
while (*nwords < MAX_WORDS) {
words[*nwords] = strtok(NULL, " \t\n");
if (!words[*nwords])
break;
*nwords = *nwords + 1;
}
}
Одна вещь, которая также усложняет понимание этого кода, это тот факт, что он всегда обращается к числу слов косвенночерез указатель nwords
.Вот еще одно переписывание без этого сокращения:
void tokenize(char *line, char **words, int *nwords)
{
int wordCount = 1;
words[0]=strtok(line," \t\n");
while (wordCount < MAX_WORDS) {
words[wordCount] = strtok(NULL, " \t\n");
if (!words[wordCount])
break;
wordCount = wordCount + 1;
}
*nwords = wordCount;
}
Наконец, для указателя p
тестирование !p
аналогично тестированию p == NULL
.Таким образом, проверка if (!words[wordCount])
означает «если последний текущий элемент в words
является нулевым указателем».Это может произойти, когда strtok
возвращает нулевой указатель, указывающий, что он завершил синтаксический анализ.
Надеюсь, теперь это немного яснее.
В общем, функция использует strtok
для извлечения словиз line
и сохраните их в последовательных элементах массива words
, с количеством сохраненных слов, возвращаемых в nwords
.
. Он будет многократно извлекать одно слово, сохранять его и увеличивать количество слов.,Это продолжается до тех пор, пока либо:
MAX_WORDS
не будет извлечено, либо strtok
вернет нулевой указатель, означая, что в line
.