c - 指针在结构数组中替换自身

标签 c arrays pointers struct

<分区>

好的,我有这段代码,它可以从文件中提取各种内容

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++;
}

现在的问题是,每次从 strtok 检索到新标记时,它都会替换结构数组中的先前值。

我已经缩小到这个 block 有问题:

d[counter].name=name;
d[counter].course=class;

它似乎指向同一个内存块,每次 strtok 返回一个新值时都会重新写入该内存块,因此我在结构中的所有指针都指向该 1 个对象。

这是我的结构:

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

};

现在我的问题是,无论如何都可以将 strtok 值放入单独的内存地址,这样它们就不会全部指向 1 个位置并替换它们自己吗?

Strdup、malloc 和 memmove 不适合我。

为了更清楚地表示正在发生的事情,这里是粗略的预期输出

Tom    Phys 1444   54
Joe    CSE 1310   95
Alex   Chem 2315   86
Tim    Span 1443   81

现在这是我得到的输出

Tim  Span 1443  54
Tim  Span 1443  95
Tim  Span 1443  86
Tim  Span 1443  81

最佳答案

问题是您有一个缓冲区,每次调用 fgets 时都会被覆盖,而对 strtok 的调用只是返回指向该缓冲区的指针。

如果您不允许使用类似 strdup 的东西来复制从 strtok 调用返回的字符串,那么我建议您只使用多个缓冲区。

例如,如果您的缓冲区当前声明为:

char buffer[256];

您可以改为将 20 个缓冲区声明为:

char buffer[20][256];

其中 20 应至少与 d 数组中的项目数一样大。

然后,您对 fgets 的调用应该根据计数器在循环的每次迭代中读入不同的缓冲区。

fgets(buffer[counter], sizeof(buffer[counter]), fp)

同样,您对 strtok 的调用应该引用适当的缓冲区。

name = strtok(buffer[counter],del);

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

相关文章:

c - 在 C 中,数组的名称是指向它第一个元素的指针,不是吗?

c - mq_open errno 13 权限被拒绝

c - 如何在编译时检测或防止未初始化的数组元素?

c++ - c/c++ 使用 else 代替 if not

c++ - 是 int a[10]={0,1,2,3,4,5,6,7,8,9};与 C++ 中的 int *a={0,1,2,3,4,5,6,7,8,9} 相同吗?

javascript - 使用 ES6 基于属性将 javascript 对象数组转换为数组的键值对

arrays - 如何快速将图像从数组下载到 tableviewcontroller?

c++ - 为什么有人告诉我数组是指针? C++中数组和指针的关系是什么?

c++ - 常量之间的区别。指针和引用?

c - 将自己的库添加到 QT creator C 项目