Как указывает julkiewicz, ваши вложенные циклы, в которых вы подсчитываете слова, могут пропустить завершающий нуль на str. Кроме того, если str
заканчивается пробелами, ваш текущий код будет считать дополнительное слово.
Вы можете заменить этот раздел:
int size = 1;
for(int i = 0; str[i] != '\0'; i++) {
if(str[i] == ' ') {
while(str[i] == ' ') {
i++;
}
size++;
}
}
.. с чем-то вроде этого:
while (*str == ' ') str++; // skip leading spaces on str
/* count words */
int size = 0;
char *s = str;
do {
if (*s && *s != ' ') {
size++; // non-space group found
while (*s && *s != ' ') s++; // skip to next space
}
while (*s == ' ') s++; // skip spaces after words
} while (*s);
.., который считает начало групп непробельных символов, а не групп пробелов, и следит за завершающим нулем во внутренних циклах.
Вы также можете подумать об изменении:
for(int i = 0; token != NULL; i++) {
.. для:
for(int i = 0; token && i < size; i++) {
.. точно так же, как слегка параноидальный охранник в случае, если strtok
находит больше слов, чем вы рассчитывали (хотя это не должно быть).