gpt4 book ai didi

c - 结构数组替换自身的值

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

好的,所以我有下面的代码,我只是从一个文件中提取各种东西并将它们输入到一个结构数组中,它最初“看起来”有效,但是当我在完成文件后打印它时它似乎用最后一个谷替换了所有类(class)和名称,奇怪的是整数(成绩)不会发生这种情况,成绩确实输入正确。

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

struct student {
char *name;
char *course;
int grade;

};

void courseSort(struct student d[20], int size);

int main(void)
{
FILE* fp;
char* filename = "grades.csv";
char buffer[100];
char* name, *class;
char* del=",";
int grade, i, counter=0;

struct student d[20];

if((fp=fopen(filename, "r"))==NULL)
{
printf("unable to open %s\n", filename);
exit(1);
}

while(fgets(buffer, sizeof(buffer), fp) !=NULL)
{
name = strtok(buffer,del);
class=strtok(NULL,del);
grade = atoi(strtok(NULL,del));

d[counter].name=name;
d[counter].course=class;
d[counter].grade=grade;
printf("%s %s %d\n",d[counter].name,d[counter].course,d[counter].grade);
counter++;
}

printf("\n\n\n");

for(i=0;i<counter;i++)
printf("%s %s %d\n",d[i].name,d[i].course,d[i].grade);
courseSort(d,counter);

fclose(fp);
}

我不确定我做错了什么:(这一切看起来都很简单,但不确定为什么它只是用最新的替换所有内容。

最佳答案

strtok 返回一个指向缓冲区的指针并且不分配内存。由于您不复制字符串,因此您最终会得到许多指向同一个缓冲区的指针,该缓冲区在循环的每次迭代中都会被覆盖。

要解决此问题,您需要更改循环以使用 strdup 复制字符串:

while(fgets(buffer, sizeof(buffer), fp) != NULL)
{
d[counter].name = strdup(strtok(buffer, del));
d[counter].course = strdup(strtok(NULL, del));
d[counter].grade = atoi(strtok(NULL, del));
counter++;
}

不要忘记在不再需要字符串时使用free 返回分配的内存:

for (i = 0; i < counter; i++) {
free(d[i].name);
free(d[i].course);

d[i].name = NULL;
d[i].course = NULL;
}

请注意,strdup 是 POSIX1.2001 标准的一部分,而不是 C89 的一部分。如果它不可用,您将不得不自己重新实现它(非常简单):

char *my_strdup(const char *str) {
char *copy;
size_t len = strlen(str) + 1;
if (len == 0) return NULL;
copy = (char *)malloc(len);
if (copy == NULL) return NULL;
memcpy(copy, str, len);
return copy;
}

关于c - 结构数组替换自身的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17634263/

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