2017-02-09 16 views
-1

Я пытался сделать программу, которая будет подсчитывать количество слов из текстового файла. У меня возникла проблема с подсчетом слов, я решил создать функцию для этого, потому что я буду делать другие вещи с помощью этой программы (я действительно хочу создать текстовый редактор, но я делаю это по частям).c программа не считая слов правильно

Проблемы заключается в том:

Моей программа возвращает огромное количество подсчитанных слов, когда я знаю, что текстовый файл имеет гораздо более низкое количество слов. То, что я действительно пытаюсь узнать здесь, - это то, как перебирать символы в массиве строк [I] [J].

Дополнительная информация:

  1. Функция, которая делает подсчет может напечатать все строки, если я простой цикл для печати всех строк. Это означает, что он правильно передал строки.
  2. Я отправляю правильное количество строк в функцию, я уже дважды проверял.

Вот мой код:

+1

Теперь сделать ответ устаревшим. Это не то, как работает этот сайт. Если инициализация 'number' не устранила вашу проблему, задайте другой вопрос, потому что не инициализация' number' является очень серьезной ошибкой и указана в данном ответе. –

+0

Строка 'strings = malloc (...' выделяет 0 байт, потому что totalLines равно 0. –

+0

@IharobAlAsimi конечно, я могу задать новый вопрос, но в основном это будет одно и то же, я просто подумал, что проще держать все в в том же месте – kirkosaur

ответ

2

Initialize number ... что проблема здесь в Funtion fWords.

Вы получаете неинициализированное значение при возврате number из функции fWords, поэтому вы получаете некоторое «огромное» значение.

Для слова логической части есть только одна или несколько букв, разделенных пробелами. Поэтому посчитайте промежутки между куском букв, и это будет нужный счет.

В fWord будет for (j = 0; array[i][j] < length; j++)

Используйте malloc правильно и проверить возвращаемое значение malloc в вашем случае, если вы использовали нулевое значение для распределения.

if(malloc(...)) {//ok ...} else { // not allocated }

+0

wow спасибо за быстрый ответ и doh! По крайней мере, это решает, что теперь я понимаю, что он не подсчитывает ничего – kirkosaur

+0

- это то, как я повторяю правильно? Потому что я попробовал bef руд с введенным текстом, и он работал правильно с этой же логикой. – kirkosaur

+1

@kirkosaur Разве вы не компилятор не предупреждаете? –

2

Вам нужно начать здесь:

int totalLines = 0; 
char **strings; 

и позже:

strings = malloc (sizeof(char *) * totalLines); 

Что любое число, умноженное на ноль;)?

Почему malloc не имеет значения?

malloc() функция выделяет байты размера и возвращает указатель на выделенной памяти. Память не инициализируется. Если размер равен 0, , то malloc() возвращает либо NULL, либо уникальное значение указателя, которое позже может быть отправлено в free().

+0

Многие другие, как и раньше, которые вызвали редактирование сообщения, которое его недействило, а не объявляли 'fWords()' перед 'main()' тоже. –

0

Их некоторые проблемы с вашим кодом:

  • Эта линия:

    strings = malloc (sizeof(char *) * totalLines); 
    

    Это в основном strings = malloc(0), потому что вы настроите totalLines в 0. Вместо этого вы должны указать начальный размер, например totalLines = 10, а затем realloc() по мере необходимости.

  • Использование realloc() так:

    strings = realloc(strings, sizeof(char *) * (totalLines) + 1); 
    

    опасно. Если strings - NULL, тогда вы потеряете доступ к strings. Вместо этого, вы можете сделать это:

    void *temp = realloc(strings, sizeof(char *) * (totalLines) + 1); 
    if (temp == NULL) { 
        /* handle error */ 
    } else { 
        strings = temp; 
    } 
    

    Я также предлагаю, возможно удвоение totalLines, вместо того, увеличивающиеся его 1 каждый раз. Это неэффективно, потому что после каждой новой строки вам нужно realloc().

  • Если вы решили использовать char content[MAX_LEN + 1];, то ваш fgets() вызов должен быть:

    fgets(content, MAX_LEN + 1, fp) 
    

    fgets() необходимо точное число байтов массива он указывает.

  • Вы также можете использовать perror(), чтобы получить обратную связь от вашей ОС:

    fp = fopen(argv[1], "r"); 
    if (fp == NULL) { 
        perror(argv[1]); 
        exit(EXIT_FAILURE);