сначала вы должны установить j=0
внутри вашего основного, в то время как l oop, в противном случае, когда вы go внутри этого l oop for(j = 0; j < count; j++)
j
увеличатся, так что здесь token[j++] = str[i++];
вы не начнется копирование str
в token
из j=0
, поэтому у вас есть предыдущие слова букв.
секунда Я считаю, что это условие if(flag <= 1)
должно быть if(flag == -1)
, потому что если, например, сначала и пятое слово аналогично, флаг будет 0
, и снова эта строка будет скопирована в uniqueToken
.
также обратите внимание, если вы достигнете \0
вас двумя вашими i++
, вы пропустите его и здесь while(str[i] != '\0')
вы не будете проверять это, поэтому я предлагаю while(str[i-1] != '\0')
также перед отправкой проверки строки, если есть что-то в этом (в случае str[0]='\0'
.
посмотрите
void numberOfWordOccurrences(char str[]) {
int count = 0, i = 0, j = 0;
char uniqueToken[99][999];
int tokenCount[99] = { 0 };
while (str[i-1] != '\0') {
j = 0;
char token[999];
while (str[i] != ' ' && str[i] != '\0') {
token[j++] = str[i++];
}
if (token[j - 1] == ':' || token[j - 1] == ',' || token[j - 1] == '.' || token[j - 1] == ';' || token[j - 1] == '?' || token[j - 1] == '!') {
token[j - 1] = '\0';
}
//null
token[j] = '\0';
//flag
int flag = -1;
for (j = 0; j < count; j++) {
if (strcmp(uniqueToken[j], token) == 0) {
//if flag is valid, then...
flag = j;
tokenCount[flag] = token[flag] + 1;
break;
}
}
if (flag == -1) {
tokenCount[count] = tokenCount[count] + 1;
strcpy(uniqueToken[count++], token);
strcpy(uniqueToken[count], "\0");
}
i++;
}
}