Чтение файла и сохранение информации в избранном списке с помощью fgets и strtok в C - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь прочитать файл, который имеет только одну строку с именами, разделенными запятыми, поэтому я использую fgets для чтения строки, а затем разделяю имена с помощью strtok, затем я хотел сохранить эти имена в связанномсписок.Я использую CodeBlocks, и когда я запускаю программу, она показывает это сообщение: «Процесс завершен со статусом -1073741510»

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define MAX_CHAR 200

typedef struct Names{
    char* name;
    struct Names* next;
}Names;

Names* create_list(){

    Names* aux = (Names*) malloc (sizeof(Names));
    assert(aux);
    aux->next = NULL;
    return aux;
}
void insert_name (Names* n, char* p){

    Names* aux = (Names*)malloc(sizeof(Names));
    aux->name = p;
    while(n->next!=NULL){
        n=n->next;
    }
    aux->next=n->next;
    n->next=aux;
}

void config(Names*p){

    FILE* fp = fopen( "names.txt", "r");

    if(fp == NULL){
        printf("Error opening file");
        return;
    }
    else{
        char line[MAX_CHAR],*token;

        fgets(line, MAX_CHAR, fp);
        token = strtok(line,",");
        insert_name(p,token);
        while(token != NULL);{
            token = strtok(NULL,",");
            insert_name(p,token);
        }
        fclose(fp);
    }
}

void print_list(Names* n){
    Names* l = n->next;
    while (l){
        printf("%s\n",l->name);
        l = l -> next;
    }
}

int main()
{
    Names* n;
    n = create_list();
    config(n);
    print_list(n);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Я думаю, что сначала вам нужно изменить присвоение имени для strcpy или memcpy, а также использовать динамическое выделение

  aux->name = (char*) malloc(strlen(p));
  strcpy(aux->name, p);

или

  typedef struct Names{
     char name[MAX_NAME_LEN];
     struct Names* next;
  }Names;
  //and use strcpy or memcpy in insert_name function

Надеюсь, это поможет.

0 голосов
/ 22 ноября 2018

У вас есть бесконечный цикл:

while(token != NULL);{

Точка с запятой завершает "тело" while, а фигурная скобка просто открывает блок кода, который не привязан ни к какому элементу управлениясостав.(Это допустимо, и это был способ создания области видимости переменных до C99.)

Без точки с запятой цикл по-прежнему неправильный: вставлять его следует только в том случае, если вы знаете, что токен не NULL:

token = strtok(line,",");

while (token != NULL) {
    insert_name(p,token);
    token = strtok(NULL,",");
}

В вашем коде по-прежнему есть ошибки:

  • Ваши токены являются указателями на локальный массив: 'line . When you leave config , these pointers become invalid, because line` станет недействительным.Вместо этого вы должны скопировать строки, просто сохраняя указатель.
  • В конце программы вы должны вызывать free для каждого вызова malloc.В других статьях, очистите свой список.
...