C программирование: проблемы с чтением текстового файла и попыткой выделить самое длинное слово - PullRequest
2 голосов
/ 19 апреля 2020

Я новичок в кодировании, так что я мог бы сделать несколько ошибок ладьи ie тут и там. Мы получили эту задачу в школе, и цель состоит в том, чтобы отсортировать самое длинное слово и напечатать его вместе с количеством символов в нем. Я дошел до этого далеко, но отсюда и дальше мне трудно найти, в чем проблема. Программа застревает на итерациях 49,50,51 и 59 раз большую часть времени. Я думаю, это потому, что reallo c возвращает NULL для переменной longestWord.

Есть идеи, где искать, чтобы решить эти проблемы? Заранее спасибо, ребята!

Ввод:

abc
abcde
abcdefghij
abcdefghij
abcdefghijklmnopq
abcdefghijklmnopq
abcdefghijklmnop
auf wiedersehen

Ожидаемый вывод:

17 characters in longest word: abcdefghijklmnopq

Мой код пока:

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

//_________//

FILE* fptr;
int c;
int iteration=0;     //Just to keep track 



//___________Main____________//

int main()
{

    fptr = fopen("C:\\....\\input", "r");

    char *s;
    char *longestWord;
    int i=1, charCount=0;

    s = (char*) malloc (sizeof(char));
    longestWord = (char*) malloc (sizeof(char));

    while((c=fgetc(fptr)) != EOF){
        iteration++;
        printf("Iteration %d\n",iteration);
        if (isalpha(c)!=0 ){

            s=realloc(s,i*sizeof(char));
            s[i]=c;
            i++;
        }

        else if(c==' ' || c =='\n'){
            if(i>charCount){
                charCount=i-1;
                longestWord=realloc(longestWord,i*sizeof(char));


                while(longestWord == NULL){
                         longestWord=realloc(longestWord,i*sizeof(char));
                }
                for(int t=0;t<i;t++){
                        *(longestWord+t)=*(s+t);

                }

                i=1;

            }

            else{
               printf("*********Checkpoint 3***************\n");                //Checkpoint 3
               i=1;

            }

        }

        else{
            printf("\n\n********Error, got to the else section of the program********\n\n");
        }

    }

    printf("%d characters in the longest word: %s\n",charCount, longestWord);

    free(s);
    free(longestWord);
    fclose(fptr);
    return 0;

} //_____________END OF MAIN____________ //

1 Ответ

1 голос
/ 19 апреля 2020

Вот обновленная версия вашего кода, которая делает то, что вы просили.

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

int main()
{
    FILE* fptr;
    int c;
    char *s;
    char *longestWord;
    int i=0;

    fptr = fopen("input.txt", "r"); // TODO: validate if fptr is not NULL

    // TODO: validate the return of mallocs
    s = (char*) malloc (sizeof(char)); // allocates 1 element
    longestWord = (char*) malloc(sizeof(char));

    while((c=fgetc(fptr)) != EOF){      
        if (isalpha(c) != 0 ){
            s=realloc(s, strlen(s)+1);
            s[i]=c;
            i++;
        }
        else if(c==' ' || c =='\n'){            
            s[i] = '\0';

            // check if it is the longest
            if(strlen(s) > strlen(longestWord)) {
                longestWord = realloc(longestWord, strlen(s)+1);
                strcpy(longestWord, s);
            }

            memset(s, '\0', strlen(s)+1);
            i=0;
        }
        else{
            printf("Weird character %c\n", c);
        }
    }

    printf("%ld characters in the longest word: %s\n", strlen(longestWord), longestWord);

    free(s);
    free(longestWord);
    fclose(fptr);
    return 0;
}

Обратите внимание на следующее:

  • Проверки возвращаемых значений функций, таких как fopen, malloc, ..., отсутствуют;
  • Глобальные переменные не имеют смысла в этой конкретной программе и поэтому были перемещены внутри основной функции;
  • Слова с символами, которые не являются частью [a-zA-Z], игнорируются.
...