2013-12-22 3 views
0

Мне нужно указать число x и написать x строк (слов). , и я должен найти тот, который написан чаще всего. он работает, но когда я пытаюсь прочитать его из файла, это не так. , например, если я делать a.out '' < «файл и файл как:найти строку (слово), которая появляется больше раз

  1. привет
  2. да
  3. мир
  4. привет
  5. нормально

все они в разных строках, каждая строка на другой строке работает, и я печатаю привет, но если много строк в одной строке, как текст, он не будет работать (привет да слово привет e.t.c ...

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    char **str; 
    int n,i,j,y; 
    int count=0; 
    printf("Give a nubmer : \n"); 
    scanf("%d", &n); 
    str = (char **)malloc(n *(sizeof(50))); 
    for(i=0; i<n+1; i++) 
      str[i] = (char *)malloc(50); 
    printf("Give n strings : \n"); 
    for(i=0; i<n+1; i++) 
    { 
      gets(str[i]); 
    } 
    for(i=0; i<n+1; i++) 
    { 
      for (j=i+1;j<n+1;j++) 
      { 
        if(strcmp(str[i],str[j])==0) 
        { 
          count++; 
        //  i++; 
          y=i; 
        } 
      } 
    } 
    printf("\n%s\n",str[y]); 
} 

является его вероятностным, что я использую получает вместо fgets?

+1

n * (sizeof (char *)) –

+1

Нет абсолютно никакого отношения к чтению из файла в вашем коде. –

+1

@BrianRoach Возможно, перенаправление? –

ответ

1

Рассмотрим следующий пример:

#define NUM_STRINGS (10) 

int strListCompare(const void *p1, const void *p2) 
{ 
    const char **str1 = p1; 
    const char **str2 = p2; 
    return strcmp(*str1, *str2); 
} 

int main(void) 
{ 
    char *strList[NUM_STRINGS] = { 
            "dog", "cat", "cat", "bat", "cat", 
            "cat", "dog", "bat", "dog", "bat" 
           }; 

    qsort(strList, NUM_STRINGS, sizeof(char *), strListCompare); 

    char *curStr = strList[0], *maxStr = strList[0]; 
    int curCount = 0, maxCount = 0; 

    for(int i = 0; i < (NUM_STRINGS - 1); i++) 
    { 
     curCount++; 

     if((strcmp(strList[i], strList[i + 1]) != 0) && (curCount > maxCount)) 
     { 
      maxCount = curCount; 
      maxStr = strList[i]; 
      curCount = 0; 
     } 
    } 

    printf("The winner! \"%s\" (%d occurrences)\n", maxStr, maxCount); 
    return 0; 
} 

Выполнение вышеуказанных результатов программы следующий вывод:

Победитель! "Кошка" (4 вхождения)

Это логика:

Сначала strList не сортируется. Я сортирую его, чтобы помочь в определении строки, которая больше всего встречается. Прежде чем сканировать strList, я предполагаю, что первым элементом будет самая встречающаяся строка. Теперь, я сканирую strList и подсчет числа. Если следующая строка совпадает с текущей строкой, я увеличиваю curCount. Как только следующая строка не совпадает с текущей строкой, я сравниваю curCount с maxCount. Если curCount больше maxCount, я нашел новую строку, которая встречается чаще всего. Я установил curCount, а текущую строку - maxCount и maxStr соответственно. Когда контур завершается, maxCount и maxStr будут иметь строку, которая больше всего встречается.

+0

да, я вижу, но проблема у меня в том, что если я получу входной файл с a.out < file.txt, и каждая строка находится в другой строке, моя программа работает, и я печатаю слово, которое появляется больше раз. но если в 1 строке есть много строк, это не так. это проблема. – nickD3

Смежные вопросы