Сравнение строк из файлов

У меня небольшая проблема. Я хочу, чтобы программа искала файл, и если он совпадает с вводом пользователя, то программа покажет «привет», а если нет, то покажет «пока». Эти выходные данные предназначены только для целей тестирования. Вернемся к проблеме. При достижении строки сравнения программа вылетает. Теперь я не знаю, как решить проблему. Я прошу кого-нибудь помочь мне, пожалуйста, и спасибо заранее. Ниже приведен фрагмент кода:

int CaseFunc();
int CaseFunc(){ 
FILE *memFile;
char memberfname[28];
char memberlname[28];
char ffname[28];
char flname[28];
char code;
struct PersonalInfo array[1000];
int memberage;
int menuANS;
int members;
int i;
members = 0;

printf("Enter your answer here: ");
scanf(" %d", &menuANS);

switch (menuANS){
    case 1:
        system("cls");
        printf("Enter code: ");
        scanf(" %c", &code);
        do {
            printf("Enter First Name: ");
            scanf("%s", memberfname);
            printf("Enter Last Name: ");
            scanf("%s", memberlname);
            printf("Enter Age: ");
            scanf("%d", &memberage);

            if ((memFile = fopen("TheCarDepot Members.txt", "a+")) == NULL){    //If the file path is incorrect, an error message is displayed
                fprintf(stderr, "Error while opening file  (%d: %s)\n",errno, strerror(errno)); //Error message that will be displayed if file path is incorrect
            return;
        }

        fprintf (memFile, "%s %s %d", memberfname,  memberlname,    memberage); 
        fprintf (memFile, "\n");            
        fclose(memFile);
        printf("\n\n");
        printf ("*%s %s is now a member of TheCarDepot Team.*\n", memberfname, memberlname);

        printf("Enter code: ");
        scanf(" %c", &code);
    }
    while (code != 'x');
    break;

    case 2:
        if ((memFile = fopen("TheCarDepot Members.txt", "r")) == NULL){ //If the file path is incorrect, an error message is displayed
            fprintf(stderr, "Error while opening file  (%d: %s)\n",errno, strerror(errno)); //Error message that will be displayed if file path is incorrect
            return;
        }

        //while the file is opened and not at the end, the strings are stored into variables which forms an array of strings
        for (members = 0; members < 200; members++) {
           if (fscanf(memFile, "%s %s %d", memberfname, memberlname, &memberage) == 3)  //Reads the contents of the file
               break;
           array[members].fname = strdup(memberfname);
           array[members].lname = strdup(memberlname);
           array[members].age = memberage;
        }
        fclose(memFile);

        printf("Enter your first name: ");
        scanf("%s", ffname);
        printf("\n");

        if (strcmp(array[members].fname, ffname) == 0){
            printf ("hello");
        }
        else if (strcmp(array[members].fname, ffname) != 0){
            printf ("bye");
        }
        break;

person Kkkkkk kkkkkk    schedule 29.03.2015    source источник
comment
Какая линия сравнения? Я вижу несколько операторов if, сравнивающих вещи.   -  person clearlight    schedule 29.03.2015
comment
@CareyGregory строка, в которой используется strcmp   -  person Kkkkkk kkkkkk    schedule 29.03.2015


Ответы (3)


Когда вы выходите из цикла for, members может быть равно 200, что является неинициализированным элементом массива. Передача его strcmp может легко привести к сбою.

Кроме того, если вы выйдете из цикла раньше, потому что fscanf завершилось успешно, ваша запись array также будет унифицирована. Еще раз, это, вероятно, приведет к сбою.

Вам нужно инициализировать запись array перед выходом из цикла, и вам нужно убедиться, что members равно ‹ 200 перед доступом к этой записи массива.

person Carey Gregory    schedule 29.03.2015

for (members = 0; members < 200; members++) {
           if (fscanf(memFile, "%s %s %d", memberfname, memberlname, &memberage) == 3)  //Reads the contents of the file
           break; //exit the loop if the reading is successful, the following lines are never executed
           array[members].fname = strdup(memberfname);
           array[members].lname = strdup(memberlname);
           array[members].age = memberage;
}

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

Также у вас есть утечка памяти, fname и lname должны быть освобождены.

person Alejandro Díaz    schedule 29.03.2015
comment
что ты имеешь в виду под освобожденным - person Kkkkkk kkkkkk; 29.03.2015
comment
@Kkkkkkkkkkkk что-то вроде free(array[i].fname); free(array[i].lname); - person Alejandro Díaz; 29.03.2015
comment
куда мне это положить? после сохранения в переменных? - person Kkkkkk kkkkkk; 29.03.2015
comment
@Kkkkkkkkkkkk всякий раз, когда вам больше не нужны эти переменные, или вы можете изменить определение структуры, чтобы использовать массивы char вместо указателей и использовать strcpy вместо strdup - person Alejandro Díaz; 29.03.2015

Вы должны проверить свой array[members].fname, если он равен NULL или не содержит символа конца строки, тогда он может дать сбой.

person Sandor    schedule 29.03.2015