0

我有以下代码:

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

1 回答 1

2

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

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

不要忘记使用malloc调用free您调用的每个块时malloc

于 2013-09-20T15:54:58.167 回答