Ошибка сегментации в C при попытке ввода - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь заставить программу на С брать список фильмов и добавлять к нему с выделением памяти и иметь возможность извлекать фильмы из списка, а также с помощью txt-файла.movies.txt 5 Mission Impossible Action 4 2008 Up Action 3 2012

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

Может ли кто-нибудь указать мне правильное направление?

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

// limit definition
#define LIMIT 999

//movie structure
struct movie
{
char name[100];
char type[30];
int rating;
int releaseDate;
};

//reads file
void readFile(FILE *fp,struct movie* movieList[],int *noOfReviews)
{
    char buffer[100];
    int counter = 0;
    struct movie* newNode;
    fgets(buffer,LIMIT,fp);
    *noOfReviews = atoi(buffer); // number of reviews in buffer
    printf("%d",*noOfReviews); //prints reviews
    while((fgets(buffer,LIMIT,fp)!=NULL) || (*noOfReviews > 0)) //if null or reviews greater than zero
    {
        if(counter % 4 == 0)
        {
        struct movie* tmpNode = (struct movie*)malloc(sizeof(struct movie)); //allocates memory
        movieList[counter] = tmpNode;
        newNode = tmpNode;
        *noOfReviews--; // --#ofreviews
        }
        //copys struc into buffer
    switch(counter % 4 )
        {

        case 0:
        strcpy(newNode->name,buffer);
        break;
        case 1:
        strcpy(newNode->type,buffer);
        break;
        case 2:
        newNode->rating = atoi(buffer);
        break;
        case 3:
        newNode->releaseDate = atoi(buffer);
        break;
        default:
        printf("Exception\n");
        break;
    }
    counter++;
    }
}
//searches list
int searchList(struct movie* movielist[],char movieName[],int noOfMovies)
{
    int counter = 0;
    while(noOfMovies--)
    {
    if(strcmp(movielist[counter]->name,movieName) == 0) // if string compares to name
    {
        return counter;
    }
    counter++;
    }
    return -1;
}
//compares strings of name
int nameStrCmp(const void *a, const void *b)
{
    return (strcmp(((struct movie*)a)->name,((struct movie*)b)->name));
}
// compares rating strings
int ratingStrCmp(const void * a, const void * b)
{
    return (((struct movie*)a)->rating - ((struct movie*)b)->rating);
}
//displays the structure
void display(struct movie* movieList[],int n)
{
int i;
struct movie* searchRslt;
for(i = 0; i < n; i++)
{
searchRslt = movieList[i];// search result index of movies list
//prints struct information
printf("name:%s\n type:%s\n rating:%d\n releaseDate:%d\n",searchRslt->name,searchRslt->type,searchRslt->rating,searchRslt->releaseDate);

}
}
//main function
int main(int argc, char *argv[])
{
char buffer[100];
int noOfReviews;
struct movie* movieList[1000];
struct movie *searchRslt;
char mName[100];
if(argc <= 1)
{
    printf("invalid");
    return 0;
}
FILE *fp = fopen(argv[1],"r");
readFile(fp,movieList,&noOfReviews);
while(1)
{
//case selection menu
int input;
printf("Enter 1 to search for a movie.\n");
printf("Enter 2 to display the list of movies by name.\n");
printf("Enter 3 to display the list of movies by rating.\n");
scanf("%d",&input);
switch(input)
{
    case 1:
    printf("Enter movie name to search:");
    scanf("%s",mName);
    int index = searchList(movieList,mName,noOfReviews);
    if(index < 0)
        printf("Not found!!\n"); // if movie not found
    else // gets movies
    {
    searchRslt = movieList[index];
    printf("name:%s\n type:%s\n rating:%d\n releaseDate:%d\n",searchRslt->name,searchRslt->type,searchRslt->rating,searchRslt->releaseDate);
    }
    break;
    case 2:
    qsort(movieList,noOfReviews,sizeof(struct movie),nameStrCmp);
    display(movieList,noOfReviews);
    break;
    case 3:
    qsort(movieList,noOfReviews,sizeof(struct movie),ratingStrCmp);
    display(movieList,noOfReviews);
    break;
    default:
    break;
}
}
}

1 Ответ

0 голосов
/ 11 декабря 2018

Несколько форматирования / читаемости / кодирования предложения : (Некоторые из них являются просто предложениями, другие фактически исключают предупреждения.) * Формат 1003 *

  • .(в основном абзацный отступ)
  • везде заменить «struct movie» на MOVIE.(см. определение структуры ниже)
  • инициализируйте переменные перед использованием.
  • обратите внимание на размер буфера при объявлении и использовании (ошибки fgets)
  • Компилировать с включенными предупреждениями.(например, с gcc use -Wall )

Следующее ограничивается рассмотрением каждого из этих элементов, включая определение новой структуры.Следующее компилируется и собирается без предупреждений или ошибок.Это не включает отладку вашего кода.(Если вы можете сделать Beyond Compare (его бесплатно) , между вашим исходным постом и отредактированной версией ниже, вы можете легко найти, где находятся изменения.)

(На момент написания этой статьи не было никакой информации о вашем входном файле, поэтому дальнейшие усилия не предпринимались.)

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

// limit definition
#define LIMIT 999

//movie structure
typedef struct {
    char name[100];
    char type[30];
    int rating;
    int releaseDate;
}MOVIE;

//reads file
void readFile(FILE *fp,MOVIE* movieList[],int *noOfReviews)
{
    char buffer[LIMIT];
    int counter = 0;
    MOVIE* newNode = {0};
    fgets(buffer,LIMIT,fp);
    *noOfReviews = atoi(buffer); // number of reviews in buffer
    printf("%d",*noOfReviews); //prints reviews
    while((fgets(buffer,LIMIT,fp)!=NULL) || (*noOfReviews > 0)) //if null or reviews greater than zero
    {
        if(counter % 4 == 0)
        {
            MOVIE* tmpNode = (MOVIE *)malloc(sizeof(MOVIE)); //allocates memory
            movieList[counter] = tmpNode;
            newNode = tmpNode;
            *noOfReviews--; // --#ofreviews
        }
        //copys struc into buffer
        switch(counter % 4 ) {

            case 0:
                strcpy(newNode->name,buffer);
                break;
            case 1:
                strcpy(newNode->type,buffer);
                break;
            case 2:
                newNode->rating = atoi(buffer);
                break;
            case 3:
                newNode->releaseDate = atoi(buffer);
                break;
            default:
                printf("Exception\n");
                break;
        }
        counter++;
    }
}
//searches list
int searchList(MOVIE* movielist[],char movieName[],int noOfMovies)
{
    int counter = 0;
    while(noOfMovies--)
    {
        if(strcmp(movielist[counter]->name,movieName) == 0) // if string compares to name
        {
            return counter;
        }
        counter++;
    }
    return -1;
}
//compares strings of name
int nameStrCmp(const void *a, const void *b)
{
    return (strcmp(((MOVIE*)a)->name,((MOVIE*)b)->name));
}
// compares rating strings
int ratingStrCmp(const void * a, const void * b)
{
    return (((MOVIE*)a)->rating - ((MOVIE*)b)->rating);
}
//displays the structure
void display(MOVIE* movieList[],int n)
{
    int i;
    MOVIE* searchRslt;
    for(i = 0; i < n; i++)
    {
        searchRslt = movieList[i];// search result index of movies list
        //prints struct information
        printf("name:%s\n type:%s\n rating:%d\n releaseDate:%d\n",searchRslt->name,searchRslt->type,searchRslt->rating,searchRslt->releaseDate);

    }
}
//main function
int main(int argc, char *argv[])
{
    int noOfReviews;
    MOVIE* movieList[1000];
    MOVIE *searchRslt;
    char mName[100];
    if(argc <= 1)
    {
        printf("invalid");
        return 0;
    }
    FILE *fp = fopen(argv[1],"r");
    readFile(fp,movieList,&noOfReviews);
    while(1)
    {
        //case selection menu
        int input;
        printf("Enter 1 to search for a movie.\n");
        printf("Enter 2 to display the list of movies by name.\n");
        printf("Enter 3 to display the list of movies by rating.\n");
        scanf("%d",&input);
        switch(input)
        {
            case 1:
                printf("Enter movie name to search:");
                scanf("%s",mName);
                int index = searchList(movieList,mName,noOfReviews);
                if(index < 0)
                    printf("Not found!!\n"); // if movie not found
                else // gets movies
                {
                    searchRslt = movieList[index];
                    printf("name:%s\n type:%s\n rating:%d\n releaseDate:%d\n",searchRslt->name,searchRslt->type,searchRslt->rating,searchRslt->releaseDate);
                }
                break;
            case 2:
                qsort(movieList,noOfReviews,sizeof(MOVIE),nameStrCmp);
                display(movieList,noOfReviews);
                break;
            case 3:
                qsort(movieList,noOfReviews,sizeof(MOVIE),ratingStrCmp);
                display(movieList,noOfReviews);
                break;
            default:
                break;
        }
    }
}
...