2013-06-22 3 views
1

Я написал функцию для подсчета частоты конкретного слова в тексте. Эта программа каждый раз возвращает ноль. Как я могу ее улучшить?подсчет числа частот слова в тексте

while (fgets(sentence, sizeof sentence, cfPtr)) 
{ 
for(j=0;j<total4;j++) 
     { 
      frequency[j] = comparision(sentence,&w); 
      all_frequency+=frequency[j]; 
}} 
. 
. 
. 
int comparision(const char sentence[ ],char *w) 
{ 
    int length=0,count=0,l=0,i; 
    length= strlen(sentence); 
    l= strlen(w); 
    while(sentence[i]!= '\n') 
    if(strncmp(sentence,w,l)) 
     count++; 
    i++; 
    return count; 
    } 
+2

Я удивлен, что ваша программа даже возвращается. Вы используете неинициализированный 'i', который никогда не увеличивается в вашем' while (предложение [i]! = '\ N') ', потому что ваш' i ++; 'выходит за пределы области цикла из-за отсутствия фигурных скобок. –

+0

Также неясно, что такое w, как инициализируется частотный массив, а не то, что total4. Это не является хорошей демонстрацией проблемы. – catfood

+0

w - это слово, взятое от пользователя. total4 - количество абзацев. – user2500540

ответ

2

У меня есть корректура вашего кода и комментарии к стилю кодировки и именам переменных. Там по-прежнему является недостатком, который я оставил с условным, что связано с тем, что он не повторяет предложение .

Вот ваш код, размеченный:

while(fgets(sentence, sizeof sentence, cfPtr)) { 
    for(j=0;j<total4;j++){ 
     frequency[j] = comparision(sentence,&w); 
     all_frequency+=frequency[j]; 
    } 

} 

// int comparision(const char sentence[ ],char *w) w is a poor variable name in this case. 

int comparison(const char sentence[ ], char *word) //word is a better name. 
{ 

    //int length=0,count=0,l=0,i; 

    //Each variable should get its own line. 
    //Also, i should be initialized and l is redundant. 
    //Here are properly initialized variables: 

    int length = 0; 
    int count = 0; 
    int i = 0; 

    //length= strlen(sentence); This is redundant, as you know that the line ends at '\n' 

    length = strlen(word); //l is replaced with length. 

    //while(sentence[i]!= '\n') 

    //The incrementor and the if statement should be stored inside of a block 
    //(Formal name for curley braces). 

    while(sentence[i] != '\n'){ 
     if(strncmp(sentence, word, length) == 0) //strncmp returns 0 if equal, so you  
      count++;        //should compare to 0 for equality 
     i++; 
    } 
    return count; 
} 
+0

Этот код имеет основную проблему: в каждом while_loop счетчик подсчитывает все символы. Как я могу решить эту проблему? – user2500540

+0

Эта программа имеет основную проблему. В каждом while_loop счетчик подсчитывает все символы. Как я могу решить эту проблему? Я знаю, что использование функции «strncmp» в этой программе неверно. – user2500540

+0

Хотя использование strncmp является плохим выбором для этой проблемы, это вполне возможно. (Я бы использовал strtok, чтобы захватить каждое слово, ограниченное пробелом). Используя арифметику указателя, мы можем компенсировать предложение значением i, позволяя вам эффективно вести поиск по списку. Таким образом, мы можем изменить первый аргумент strncmp на (предложение + i), чтобы решить проблему таким образом. Однако это решение не является контекстно-зависимым, поэтому, если мы ищем «огонь», и мы находим «пожарный», он будет считать это как огонь в тексте. – jcccj1