Извлечение целых чисел из строки и сохранение их в связанных списках - PullRequest
0 голосов
/ 18 декабря 2018

Я написал код, который сохраняет содержимое из файла в связанный список.Однако я хочу извлечь возраст и сохранить их в массиве int.Например, Марта будет храниться в имени, а 12 - в возрасте.

Я думал о способах его реализации, но не могу найти правильное решение.

код ниже хранит марту 12 в массив символов.

#include <stdio.h>
#include <stdlib.h> 
#include <stdio.h>
#include <stdlib.h> 
#include <string.h>
#define MAXN 50    
#define val 2
typedef struct node {
    char name[MAXN];
    //int value[val];
    struct node *next;
}
node;

int main (int argc, char **argv) {

    FILE *file = argc > 1 ? fopen (argv[1], "r") : stdin;
    if (file == NULL)
        return 1;

    char buf[MAXN];
   // int buf2[val];

    node *first = NULL, *last = NULL;   


    while (fgets (buf, MAXN, file)) {

        node *head = malloc (sizeof(node));
        if (head == NULL) {         
            perror ("malloc-node"); 
            return 1;   
        }


        buf[strcspn(buf, "\n")] = 0;    


        strcpy (head->name, buf);
        head->next = NULL;


        if (!last)
            first = last = head;
        else {
            last->next = head;
            last = head;
        }


    }

    if (file != stdin)  
        fclose(file);

    node *ptr = first;              
    while (ptr != NULL) {           
        node *node_t = ptr;         
        printf ("%s\n", ptr->name); 
        ptr = ptr->next;            
        free (node_t);              
    }

    return 0;
}

Это входной файл:

Martha 12
Bill 33
Max 78
Jonathan 12
Luke 10
Billy 16
Robert 21
Susan 25
Nathan 20
Sarah 22

Есть предложения?Заранее спасибо.

1 Ответ

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

Вам не понадобится массив для value, только int.Также я бы использовал N в верхнем регистре для typedef и соответственно изменил объявления переменных (Node *head;)

typedef struct node {
    char name[MAXN];
    int value;
    struct node *next;
} Node;

Вместо копирования строки, которую вы только что прочитали, с помощью strcpy, вы должны проанализироватьстрока с sscanf и присвоить значения struct.Обратите внимание, что мы ставим оператор & перед ссылкой на head->value, потому что нам нужен указатель на value:

sscanf(buf, "%s %d", head->name, &head->value);

Для обработки ошибок вы также можете проверить количество возвращаемых значений:

if(sscanf(buf, "%s %d", head->name, &head->value) != 2) {
    /* Do some error handling */
}
...