C програма: strcasecmp() не работи

Опитвам се да преброя броя на срещанията на дума в динамичен масив от структура. Но резултатът не съответства на необходимия отговор. Всякакви насоки или модификации на кода ще бъдат високо оценени.

 void COUNT(struct wordsStruct *allWords, int size)
{
    int boolean = 0;
    int count = 0;

    for (int i = 0; i < size; i++)
    {
        count = 0;
        for (int j = i + 1; j < size; j++)
        {
            printf("Comparing %s with %s \n", (allWords[i].name, allWords[j].name));
            if (strcasecmp(allWords[i].name, allWords[j].name) == 0)
            {
                boolean = 1;
                count++;
            }
            else
            {
                boolean = 0;
            }
        }
        if (boolean == 1 && count != 0)
        {
            allWords[i].number = count;
        }
    }
}

int main(int argc, char** argv)
{
    // Declaring Variables
    FILE *fileReader;
    int numberOfWords;
    struct wordsStruct *container;

    if (argc == 1)
    {
        printf("More Arguments Needed. \n");
    }
    else if (argc == 2)
    {
        numberOfWords = SCAN(&fileReader, argv[1]);
        printf("Number Of Words: %d. \n", numberOfWords);
        container = LOAD(fileReader, numberOfWords, argv[1]);

        qsort(container, numberOfWords, sizeof(struct wordsStruct), compare);

        COUNT(container, numberOfWords);

        for (int i=0; i<numberOfWords; i++)
        {
            printf("WORD: %s. \t", container[i].name);
            printf("Occurence: %d. \n", container[i].number);
        }
    }       
    return (0);
}

    typedef struct wordsStruct
    {
        char* name;
        int number;
    }wordsStruct;

//INPUT FILE
My
Code
ZZZ
ZZZ
Is
Not
zzz
ZZZ
zzz
Working

//Output
WORD: Code.     Occurence: 1. 
WORD: Is.   Occurence: 1. 
WORD: My.   Occurence: 1. 
WORD: Not.  Occurence: 1. 
WORD: Working.  Occurence: 1. 
WORD: Working.  Occurence: 1. 
WORD: zzz.  Occurence: 4. 
WORD: ZZZ.  Occurence: 3.   // THIS SHOULD BE 5?
WORD: zzz.  Occurence: 2. 
WORD: ZZZ.  Occurence: 1. 
WORD: ZZZ.  Occurence: 1.

person user3337714    schedule 10.03.2015    source източник


Отговори (1)


Вие правите погрешно заключение, че strcasecmp не работи.

Имате някои логически грешки в кода си.

for (int j = i + 1; j < size; j++)
{
    printf("Comparing %s with %s \n", (allWords[i].name, allWords[j].name));
    if (strcasecmp(allWords[i].name, allWords[j].name) == 0)
    {
        boolean = 1;
        count++;
    }
    else
    {
        boolean = 0;
    }
}

Горният блок от код страда от:

  1. Не спира, след като намери несъответстваща дума.
  2. Когато последната дума в списъка не съвпада с думата в индекс i, тя задава boolean на 0, което се използва за проверка дали е намерено съвпадение или не.

Опитайте тази:

for (int i = 0; i < size; i++)
{
   count = 0;
   int j;
   for ( j = i + 1; j < size; j++)
   {
      printf("Comparing %s with %s \n", (allWords[i].name, allWords[j].name));
      if (strcasecmp(allWords[i].name, allWords[j].name) == 0)
      {
         boolean = 1; // Don't need this at all.
         count++;
      }
      else
      {
         break;
      }
   }

   if (count != 0)
   {
      allWords[i].number = count;
   }

   // If there are three matching words, j would be i + 3;
   // We don't need to compare the words at i+1, i+2 again.
   // Change i to be the index of the next word for comparison.
   i = j-1;
}

Актуализация

Частта за

allWords[i].number = count;

трябва да е по-добре.

for (int i = 0; i < size; i++)
{
   // The count is at least 1
   count = 1;
   int j;
   for ( j = i + 1; j < size; j++)
   {
      printf("Comparing %s with %s \n", (allWords[i].name, allWords[j].name));
      if (strcasecmp(allWords[i].name, allWords[j].name) == 0)
      {
         boolean = 1; // Don't need this at all.
         count++;
      }
      else
      {
         break;
      }
   }

   for ( ; i < j; ++i ) 
   {
      allWords[i].number = count;
   }
}
person R Sahu    schedule 10.03.2015
comment
дали i = j-1; ще бъде в рамките на гнездото за цикъл? Получих грешка - person user3337714; 10.03.2015
comment
Да, това има смисъл сега. Декларацията на j трябва да бъде извън вътрешния for цикъл. Оправих отговора. - person R Sahu; 10.03.2015
comment
също не трябва ли това да е allWords[i].number = count; -› allWords[i].number += count;. така че да можем да отчетем и оригиналната дума. - person user3337714; 10.03.2015
comment
актуализираното присвояване на код за преброяване не е последователно. Някои zzz са 4 или 5. Предишният ми коментар за използване на += коригира кода. - person user3337714; 10.03.2015