改变数组的大小

时间:2013-09-20 15:49:22

标签: c arrays struct structure

我有以下代码:

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

1 个答案:

答案 0 :(得分:2)

数组不会在C中动态增长。所以你有几种方法:

  1. 获取指向内存块的指针(使用malloc)并在需要更多数据空间时使用realloc - 并将指针编入指针
  2. 使用malloc为要添加到列表中的每个新项目创建链接列表
  3. 使用malloc在您为free调用的每个块上调用malloc时,请不要忘记。