Как найти уникальное количество слов вхождения? - PullRequest
0 голосов
/ 06 апреля 2020

Не могу понять ошибку в моем коде. Каждый раз, когда я ввожу предложение, счетчик увеличивается, но слово добавляет первую букву предыдущего слова и увеличивает на одну букву каждый раз. Как мне это исправить?

void numberOfWordOccurrences(char str[MAX_CHAR]) {
int count = 0, i = 0, j = 0;
  char uniqueToken[99][999];
  int tokenCount[99] = {0}; 
  while(str[i] != '\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);
    }
    i++;
  }
}``` 

1 Ответ

0 голосов
/ 06 апреля 2020

сначала вы должны установить 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++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...