gpt4 book ai didi

c - 将数据存储在列表 c 中

转载 作者:太空宇宙 更新时间:2023-11-04 07:49:24 24 4
gpt4 key购买 nike

我的程序的想法是从一个文件中读取数据(在本例中文件包含 5 个名称),并将它们存储在一个列表中,因此我可以稍后使用这些数据来计算最小/最大字符。到目前为止,我已经能够读取数据并将其打印出来,但我不想打印,而是想将它们保存到列表中。我找不到解决此问题的方法,因此非常感谢您的帮助。

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

int main(void) {

char file, filename[25];
FILE *f;

printf("Enter the file name: ");
scanf("%s", filename);

f = fopen(filename, "r");

if (f == NULL)
{
perror("No file found.\n");
return 0;
}

printf("The contents of %s file are:\n", filename);

while((file = fgetc(f)) != EOF)
printf("%c", file);

fclose(f);

return 0;
}

最佳答案

只是一个使用列表链接名称的简单示例:

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

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

int append(NameList ** head, NameList ** tail, char * s)
{
NameList * l;

if (((l = malloc(sizeof(NameList))) == NULL) ||
((l->name = strdup(s)) == NULL))
/* not enough memory */
return 0;

l->next = NULL;
if (*head == NULL) {
*head = *tail = l;
}
else {
(*tail)->next = l;
*tail = l;
}

return 1;
}

int main(void) {
char filename[25];
FILE * f;

printf("Enter the file name: ");
if (scanf("%24s", filename) != 1)
return 0;

f = fopen(filename, "r");

if (f == NULL)
{
puts("No file found.");
return 0;
}

NameList * head = NULL;
NameList * tail = NULL;
char s[64];

/* suppose a name has no space even composed and less than 64 characters */
while (fscanf(f, "%63s", s) == 1) {
if (!append(&head, &tail, s))
return 0;
}

fclose(f);

printf("The names in %s file are:\n", filename);

NameList * l;

l = head;
while (l != NULL) {
puts(l->name);
l = l->next;
}

/* search longer name */
size_t maxlen = 0;
char * longer = NULL;

l = head;
while (l != NULL) {
size_t ln = strlen(l->name);

if (ln > maxlen) {
maxlen = ln;
longer = l->name;
}

l = l->next;
}
if (longer != NULL)
printf("longer name is : %s\n", longer);

/* free resources */
while (head != NULL) {
l = head;
head = head->next;
free(l->name);
free(l);
}

return 0;
}

编译与执行

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra l.c
pi@raspberrypi:/tmp $ cat aze
firstname secondname
anothername
lastname
pi@raspberrypi:/tmp $ ./a.out
Enter the file name: aze
The names in aze file are:
firstname
secondname
anothername
lastname
longer name is : anothername

valgrind 下执行

pi@raspberrypi:/tmp $ valgrind ./a.out
==10132== Memcheck, a memory error detector
==10132== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==10132== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==10132== Command: ./a.out
==10132==
Enter the file name: aze
The names in aze file are:
firstname
secondname
anothername
lastname
longer name is : anothername
==10132==
==10132== HEAP SUMMARY:
==10132== in use at exit: 0 bytes in 0 blocks
==10132== total heap usage: 12 allocs, 12 frees, 6,570 bytes allocated
==10132==
==10132== All heap blocks were freed -- no leaks are possible
==10132==
==10132== For counts of detected and suppressed errors, rerun with: -v
==10132== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)

请注意,链表可以替换为 char* 数组,在读取名称等时使用 realloc 来增加其大小

关于c - 将数据存储在列表 c 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com