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. メモリのブロックへのポインタを取得し(を使用mallocrealloc、配列用により多くのスペースが必要な場合はいつでも使用し、ポインタにインデックスを付けます
  2. リストに追加するすべての新しいアイテムを使用して、リンクされたリストを作成mallocします

呼び出したすべてのブロックmallocを呼び出すときに忘れないでください。freemalloc

于 2013-09-20T15:54:58.167 に答える