gpt4 book ai didi

改变数组的大小

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

我有以下代码:

typedef struct my_data {
char* name;
}my_data;

my_data data[]={
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};


void loaddata()
{
FILE * in;
if((in = fopen("data.txt","rt")) != NULL) {
memset(data, 0, sizeof(data));
int i = 0;
while(!feof(in))
{
fscanf(in,"%s", &data[i].name);
i++;
};
fclose(in);
}
}

要读取内容并处理它们,我使用这个:

for (i=0; i<sizeof(data)/sizeof(data[0]); i++)

但是如果文件中的行数小于定义数组的数量,我会得到很多空记录,所以我将其修改为:

for (i=0; (i<sizeof(data)/sizeof(data[0])) && strlen(data[i].name)>0; i++)

工作正常,但我敢肯定,如果文件中的行数大于定义的数组大小,我会出错。

知道如何使这段代码安全吗?要动态更改数组?

编辑:这种方式适用于尺寸 300

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

typedef struct my_data {
char name[100];
}my_data;

struct my_data data[300];

my_data data_arr[]={
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};

void process_data()
{
char name[100];
int i;
for (i=0; (i<sizeof(data)/sizeof(data[0])) && strlen(data[i].name)>0; i++) {
sprintf(name, "%s", data[i].name);
printf("%s\n", name);
}
}

void load_data()
{
int i = 0;
FILE * in;
if((in = fopen("data.txt","rt")) != NULL) {
while(!feof(in))
{
fscanf(in,"%s", &data[i].name);
i++;
};
fclose(in);
}
else
{
for (i=0; (i<sizeof(data_arr)/sizeof(data_arr[0])) && strlen(data_arr[i].name)>0; i++) {
sprintf(data[i].name, "%s", data_arr[i].name);
}
}
return;
}

int main()
{
load_data();
process_data();
return 0;
}

最佳答案

数组在 C 中不会动态增长。因此您有几种方法:

  1. 获取一个指向内存块的指针(使用malloc)并在需要更多空间用于数组时使用realloc - 并索引到您的指针
  2. 使用 malloc 为您要添加到列表中的每个新项目创建一个链表

不要忘记在使用 malloc 调用 free 时调用 malloc 的每个 block 。

关于改变数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18920884/

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