Извлечение целых чисел из строки и сохранение их в связанных списках

Я написал код, который сохраняет содержимое файла в связанный список. Однако я хочу извлечь возраст и сохранить их в массиве 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

Какие-либо предложения? Заранее спасибо.

Пожалуйста, сузьте проблему. Можно ли сохранять и извлекать значения в / из связанного списка, если значения жестко запрограммированы? Можно ли читать и печатать значения из файла без сохранения в связанный список? Измените вопрос, чтобы продемонстрировать только оставшуюся проблему.

Yunnosch 18.12.2018 13:06

Оставшаяся проблема - извлечь целое число из строки и сохранить его в массиве int для каждого узла.

momonosuke 18.12.2018 13:13

Значит, когда вы говорите «сохранить в связанный список» и «сохранить в массиве int», вы имеете в виду совершенно разные вещи? (Я думал, что вы просто использовали «массив» вместо связанного списка.)

Yunnosch 18.12.2018 13:17

Вы хотите сохранить строку типа "Martha" вместе с int вроде 12 в массиве int? Пожалуйста, объясните об этом подробнее.

Yunnosch 18.12.2018 13:18

Почему бы вам не сохранить его прямо в массив из файла?

Sayed Sohan 18.12.2018 13:23

@Yunnosch Я хочу разделить марту 12. Например, в первом узле у меня будет имя символа и возраст int. Итак, марфа будет сохранена во имя, а 12 - в возрасте. Это то, о чем я думал

momonosuke 18.12.2018 13:28

Что такое age? Это должно быть в struct node? Очень непонятный вопрос и очень странный подход.

Jabberwocky 18.12.2018 13:30

Кстати, это похоже на Проблема XY. Чего здесь пытаются достичь yolu фактически?

Jabberwocky 18.12.2018 13:32

@Jabberwocky да, это должно быть в узле структуры. Затем разделите имя и возраст Марты и других на массивы в узле

momonosuke 18.12.2018 13:34

@momonosuke прочитал мой последний комментарий и щелкнул по ссылке «Проблема XY» в нем. А затем сообщите нам, что вы на самом деле хотите сделать с данными в списке и / или в массиве или что-то еще. Возможно, ваш подход в целом неверен, но без дополнительной справочной информации об этом сложно сказать.

Jabberwocky 18.12.2018 13:37

@momonosuke Если вы хотите разделить данные в value и name, просто используйте sscanf(), а затем поместите эти значения в связанный список.

Sayed Sohan 18.12.2018 13:41

@Jabberwocky. Я хочу прочитать содержимое входного файла и сохранить его в связанном списке. Входной файл содержит имя и возраст. Для каждого узла существует массив символов для имени и массив int для возраста. Однако код, который я предоставил ниже, сохраняет все в массиве символов. Я не знаю, как изменить свой код, чтобы имя и возраст сохранялись отдельно.

momonosuke 18.12.2018 13:46

@SayedSohan, так что это неправильный подход?

momonosuke 18.12.2018 13:47

@momonosuke no .. См. мой ответ ниже, как я разделяю данные с помощью sscanf() с помощью fgets().

Sayed Sohan 18.12.2018 13:49

@momonosuke в этом ответе я использовал массив для хранения всех данных, но вы можете просто взять 2 переменные и сохранить их связанный список в том же цикле. как вы это делали в своем решении

Sayed Sohan 18.12.2018 13:51

@SayedSohan, поэтому в моем цикле я должен использовать sscanf для сохранения имени в массиве char и возраста в массиве int?

momonosuke 18.12.2018 13:58

@momonosuke вам не нужно использовать массив. Я редактирую свой ответ вашим кодом. подождите 2 мин.

Sayed Sohan 18.12.2018 14:00

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

Jabberwocky 18.12.2018 14:01

@Jabberwocky Извините за то, что запутали вас и остальных. Это означает, что мой код не создает никакого списка? Я думал, что мой код создает связанный список. Например, узел 1 имеет строку martha 12, узел 2 имеет строку Bill 33, и все они связаны друг с другом.

momonosuke 18.12.2018 14:08

@SayedSohan хорошо, спасибо

momonosuke 18.12.2018 14:22

Список составлен нормально, хотя наименования несколько наоборот. Думаю, дело вкуса ...

Janne Tuukkanen 18.12.2018 14:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
21
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для 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 */
}

Другие вопросы по теме