gpt4 book ai didi

c - 在链接列表中存储字符串时遇到问题

转载 作者:行者123 更新时间:2023-11-30 15:51:22 24 4
gpt4 key购买 nike

我在将字符串存储在链接列表中时遇到问题。这是向列表插入节点的函数:

void insert_rec(rec_ptr *h_ptr, rec_ptr *t_ptr, int a, int b, int c, char* cs)
{

rec_ptr new_ptr;
new_ptr = rec_ptr( malloc( sizeof(REC) ) );

if(new_ptr != NULL)
{
new_ptr->x = a;
new_ptr->y = b;
new_ptr->z = c;
new_ptr->c = cs;
new_ptr->next = NULL;

if(*h_ptr == NULL){
*h_ptr = new_ptr;
}
else{
(*t_ptr)->next = new_ptr;
}
*t_ptr = new_ptr;
}
else
{
printf("%d %d %d not inserted. No memory available.\n",a,b,c);
}
}

这是从输出文件读取输入的函数。我将一个字符串作为 char* 插入到列表中。 fscanf() 已正确读取字符串。

void read_from_input2(rec_ptr & hptr, rec_ptr & tptr)
{

fp3=fopen("input2.txt","r");

if (fp3 == NULL)
printf("Error: Couldn't open file: input2.txt\n");
else
{
while(!feof(fp3))
{
int x,y,z;
char c1[10];
fscanf(fp3,"%d",&x);
fscanf(fp3,"%d",&y);
fscanf(fp3,"%d",&z);
fscanf(fp3,"%s",c1);
char *c2 = c1;
insert_rec(&hptr,&tptr,x,y,z,c2);
}
}
fclose(fp3);
}

这是我遇到问题的功能。当我从链表中提取数据时,变量c1输出垃圾。

void write_to_output2(rec_ptr hptr)
{

fp4=fopen("output2.txt","w");

if (fp4 == NULL)
printf("Error: Couldn't open file: output2.txt\n");
else
{
if(hptr == NULL){
printf("List is empty.\n\n");
}
else{
while(hptr != NULL)
{
int x,y,z;
char *c1,*c2;
x = hptr->x;
y = hptr->y;
z = hptr->z;
c1 = hptr->c;
c2 = get_class(x,y,z);
fprintf(fp4,"%d %d %d %s %s\n",x,y,z,c1,c2);
hptr = hptr->next;
}
}
}
fclose(fp4);
}

如果有人看到我的错误,请帮助我。谢谢。

最佳答案

char c1[10];
/* ... */
char *c2 = c1;
insert_rec(&hptr,&tptr,x,y,z,c2);

问题是c1位于read_from_input2的堆栈上,然后您存储了指向其内容的指针。当 while 结束时,它将超出范围,因此对其的访问将无效。

您需要对其进行strdup(或同等操作)。

char *c2 = strdup(c1);

/* or */

new_ptr->c = strdup(cs);

并且不要忘记在某个时候释放它。

关于c - 在链接列表中存储字符串时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15184625/

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