как мне справиться с этой ошибкой сегментации - PullRequest
0 голосов
/ 07 января 2020

Я получаю одно и то же сообщение "Ошибка сегментации: 11"
GDB говорит мне, что точка останова находится сразу после основной функции. в строке, где я объявляю int j; я действительно не понимаю, как это может нарушить код.

ввод, который читает эта функция, состоит из одной строки, за которой следуют 2 числа, такие как

john 22 43 sam 11 23

все, что он должен сделать, это просто сохранить весь ввод в "elenco" и затем напечатать строки.

сначала я создал структуру, которая соответствует вводу. Затем я сделал функцию с целью чтения ввода и сохранения в переменной. затем я сделал функцию, чьи переменные являются выходными данными функции, которая читает входные данные (то есть входные) и печатает строки, заданные

. Может кто-нибудь помочь мне определить проблему и решить ее?

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

typedef struct
{
    char name[20];
    int distance;
    int point;
}  throw;

throw *read_file(FILE *f, int *j)
{
    int i = 0;
    int c;
    int Dim = 32;
    char buf[1000];
    throw *list;

    list = malloc(Dim *sizeof(*list));
    if (list == NULL)
    {
        (*j) = 0;
        return NULL;
    }
    while (fgets(buf, sizeof(buf), f)!= NULL)
    { 
        sscanf(buf, "%19s %d %d",
        list[*j].name,
        &list[*j].distance,
        &list[*j].point);
        *j += 1;

        if ( *j >= Dim)
        {
            Dim = Dim*2;
            list = realloc(list, Dim *sizeof(*list));
            if (list == NULL)
            {
                return NULL;           
            }
        }
    }
    return list;
}

void print_everything(throw *list, int j)
{
    int c;
    for (c=0; c < j; c++ )
    {
        printf("%d\n",list[c].distance);
    }
}

int main(int argc,const char  *argcv[])
{
    int j = 0;
    FILE *file;
    throw *list;
    if (!( argc != 3))
    {
        printf("file's dimension is wrong\n");
        return -1;
    }

    file = fopen(argcv[1], "r");

    list = read_file(file, &j);

    print_everything(list, j);
    fclose(file);

    return 0;
}

input1.txt

Марио 20 30
Джорджо 30 40
Марио 40 40
Давиде 32 20
Марио 9 32

это именно то, что файл содержал

Ответы [ 2 ]

0 голосов
/ 08 января 2020

Внесены некоторые изменения в ваш код, который вы неправильно используете в списках, попробуйте использовать указатели

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

#define MAXSTR 250

typedef struct elenco
{
    char *name;
    int distance;
    int point;
    struct elenco *next;
}  throw;

throw *list_add(throw *list, int distance, int point, const char *name)
{
    throw *new = malloc(sizeof(throw));
    if (new != NULL) {
        new->distance = distance;
        new->point = point;
        new->name =(char*)malloc(strlen(name)+1);
        strcpy(new->name,name);
        new->next = list;
        return new;
    }
    return list;
}

throw *read_file(FILE *f)
{
    char buf[MAXSTR];

    throw *list = malloc(sizeof(throw));

    while (fgets(buf, sizeof(buf), f)!= NULL)
     { 
         char name[MAXSTR];
         int distance;
         int point;
        sscanf(buf, "%s %d %d",
            name,
            &distance,
            &point);

            list = list_add(list, distance, point, name);
}
    return list;
}


void print_everything(throw *list)
{

    while (list) {
        printf("%d\n",list->distance);
        list = list->next;
    }

}


int main()
{
    int argc;
    const char  *argcv;
    FILE *file;

    if (!( argc != 3))
    {
    printf("file's dimension is wrong\n");
    return -1;
    }


    file = fopen(&argcv[1], "r");

    throw *list = read_file(file);
    print_everything(list);

    fclose(file);

return 0;
}
0 голосов
/ 08 января 2020

Ваша программа в порядке. Ваша проблема в input1.txt, вам нужно

Mario 20 30
Giorgio 30 40
Mario 40 40
Davide 32 20
Mario 9 32

Каждая строка нуждается в \ n, как вы читаете с помощью fgets ()

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