1

私はCにかなり慣れていないので、多次元文字配列の初期化に頭を悩ませようとしています。割り当てのために、ファイルから読み取り、テキストを配列に保存するように求められます。

5 人の架空の人物の入力を読み取り、それらに関する情報を保存する必要があるため、配列が次のようになることに気付きました。

char input[5][];

私が混乱しているのは2番目のパラメーターです。何を設定すればよいかわかりません。これらの人々について保存する情報には 9 つのフィールドがありますが、この 2 番目の数値をフィールドの数に設定する必要があるのか​​、それともどのくらいの大きさに設定する必要があるのか​​について、答えが見つからないようです。つまり、

char input[5][9];

また

char input[5][256];

また、後者の場合、どのくらい大きく設定するか、または単に数値を選択するかの練習はありますか? ありがとう!

4

2 に答える 2

4

次のアプローチを取ることをお勧めします。charこれらの人に関する情報を格納する配列を作成する代わりにstruct、あらかじめ定義された長さの情報変数を持つ人を作成する必要があります。

struct person {
    char name[50];
    char address[50];
    char phone_number[15];
};

または、必要に応じて、これらの char ポインター ( char *name、などchar *address) を作成しmalloc()、必要に応じて各変数に必要な量のメモリを作成できます (また、使用後にメモリを忘れないでくださいfree)。

次に、主に、 などの人物の配列を作成し、struct person[5];必要に応じてそれらを操作できます。

編集:また、パンクラテスがコメントしたように、配列のサイズを定義するときは、入力が配列の長さを超えないようにする必要があることに注意してください。そうしないと、自分のものではないメモリに何かを書き込むことになります。これにより、未定義の動作が発生します。

于 2013-10-01T01:24:35.843 に答える
1

これを理解するには、入力について学ぶ必要があります。5 人に対して 9 つのフィールド (単一の文字データ) しかないことが絶対に確実な場合は、それを に設定する必要がありますchar input[5][9]

将来、9 よりも多くの情報フィールドが存在する可能性があると思われる場合は、 のような高い値を選択できますchar input[5][256]。ただし、フィールドのデータがまばらな場合、これは多くのスペースを浪費します。これはメモリの静的割り当てです

したがって、各人物のフィールド数が不明な場合の 3 番目のオプションは、次のようにメモリを動的に割り当てることです。

char* input[5];
input[0] = malloc(sizeof(char) * 100); // space of 100 chars

ここで最後のケースでは、メモリはコンパイル時ではなく実行時に与えられます。ユーザー入力からサイズを取得し、それをフィールドのメモリ割り当てに使用することもできます。

char* input[5];
int size = 0;
scanf("%d",&size);
input[0] = malloc(sizeof(char) * size);

さらに、各フィールドが複数の文字を取るフィールドを保存する必要がある場合は、構造体を作成する必要があります。

struct person
{  char name[30];   // memory could be assigned dynamically or statically
   char field1[30];
   char field2[30];
   ...
};
于 2013-10-01T01:29:20.217 に答える