gpt4 book ai didi

c - 使用 C 中的 fgets 和 strtok 读取文件并将信息保存在喜欢的列表中

转载 作者:行者123 更新时间:2023-11-30 16:25:17 24 4
gpt4 key购买 nike

我正在尝试读取一个文件,该文件只有一行,名称以逗号分隔,因此我使用 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;
}

最佳答案

这里有一个无限循环:

while(token != NULL);{

分号终止 while 的“主体”,大括号只是打开一个未附加到任何控制结构的代码块。 (这是合法的,并且是 C99 之前确定变量范围的一种方法。)

没有分号,循环仍然是错误的:只有当您知道标记不是 NULL 时才应该插入:

token = strtok(line,",");

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

您的代码中仍然存在错误:

  • 您的标记是指向本地数组“line”的指针。当你离开config时,这些指针将变得无效,因为line`将变得无效。您应该复制字符串而不是只存储指针。
  • 在程序结束时,每次调用 malloc 时都应该调用 free。换句话说,清理你的 list 。

关于c - 使用 C 中的 fgets 和 strtok 读取文件并将信息保存在喜欢的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437066/

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