Я написал код, который сохраняет содержимое файла в связанный список. Однако я хочу извлечь возраст и сохранить их в массиве 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
Какие-либо предложения? Заранее спасибо.
Оставшаяся проблема - извлечь целое число из строки и сохранить его в массиве int для каждого узла.
Значит, когда вы говорите «сохранить в связанный список» и «сохранить в массиве int», вы имеете в виду совершенно разные вещи? (Я думал, что вы просто использовали «массив» вместо связанного списка.)
Вы хотите сохранить строку типа "Martha" вместе с int вроде 12 в массиве int? Пожалуйста, объясните об этом подробнее.
Почему бы вам не сохранить его прямо в массив из файла?
@Yunnosch Я хочу разделить марту 12. Например, в первом узле у меня будет имя символа и возраст int. Итак, марфа будет сохранена во имя, а 12 - в возрасте. Это то, о чем я думал
Что такое age
? Это должно быть в struct node
? Очень непонятный вопрос и очень странный подход.
Кстати, это похоже на Проблема XY. Чего здесь пытаются достичь yolu фактически?
@Jabberwocky да, это должно быть в узле структуры. Затем разделите имя и возраст Марты и других на массивы в узле
@momonosuke прочитал мой последний комментарий и щелкнул по ссылке «Проблема XY» в нем. А затем сообщите нам, что вы на самом деле хотите сделать с данными в списке и / или в массиве или что-то еще. Возможно, ваш подход в целом неверен, но без дополнительной справочной информации об этом сложно сказать.
@momonosuke Если вы хотите разделить данные в value
и name
, просто используйте sscanf()
, а затем поместите эти значения в связанный список.
@Jabberwocky. Я хочу прочитать содержимое входного файла и сохранить его в связанном списке. Входной файл содержит имя и возраст. Для каждого узла существует массив символов для имени и массив int для возраста. Однако код, который я предоставил ниже, сохраняет все в массиве символов. Я не знаю, как изменить свой код, чтобы имя и возраст сохранялись отдельно.
@SayedSohan, так что это неправильный подход?
@momonosuke no .. См. мой ответ ниже, как я разделяю данные с помощью sscanf()
с помощью fgets()
.
@momonosuke в этом ответе я использовал массив для хранения всех данных, но вы можете просто взять 2 переменные и сохранить их связанный список в том же цикле. как вы это делали в своем решении
@SayedSohan, поэтому в моем цикле я должен использовать sscanf для сохранения имени в массиве char и возраста в массиве int?
@momonosuke вам не нужно использовать массив. Я редактирую свой ответ вашим кодом. подождите 2 мин.
Присмотритесь к созданию вашего списка. Это все неправильно и совсем не работает. Сосредоточьтесь на этом в первую очередь и только на этом. Как только код, создающий список, будет правильным, можно двигаться дальше.
@Jabberwocky Извините за то, что запутали вас и остальных. Это означает, что мой код не создает никакого списка? Я думал, что мой код создает связанный список. Например, узел 1 имеет строку martha 12, узел 2 имеет строку Bill 33, и все они связаны друг с другом.
@SayedSohan хорошо, спасибо
Список составлен нормально, хотя наименования несколько наоборот. Думаю, дело вкуса ...
Для 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 */
}
Пожалуйста, сузьте проблему. Можно ли сохранять и извлекать значения в / из связанного списка, если значения жестко запрограммированы? Можно ли читать и печатать значения из файла без сохранения в связанный список? Измените вопрос, чтобы продемонстрировать только оставшуюся проблему.