C言語は非常に低水準の言語であるため、各フィールドの処理方法を決定する必要があります。
あなたの場合name
、指摘されたデータを所有しているのは誰であるかを決定し、適切にコーディングする必要があります。おそらく次のようなものです。
typedef struct person_st {
char* name; // malloc-ed string
int age;
} Person;
// allocate a Person of given name and age
Person* make_person(const char* n, int a) {
if (!n || a<0) return NULL;
Person* p = malloc(sizeof(Person));
if (!p)
perror("malloc Person"), exit(1);
p->name = strdup(n);
if (!p->name)
perror("strdup Person"), exit(1);
p->age = a;
return p;
}
// destroy a Person and the data inside
void destroy_person(Person*p) {
if (!p) return;
free (p->name);
free (p);
}
// read and allocate a Person
Person* input_person(FILE*f) {
if (!f) return NULL;
char name[104];
int age;
memset (name, 0, sizeof(name));
age = 0;
if (fscanf(f, " %100[A-Za-z] %d", &name, &age)<2)
return NULL;
return make_person(name, age);
}
input_person
の呼び出し元が適切に呼び出す必要がある規則を使用しdestroy_person
ます。
私はあなたの質問を誤解したかもしれません。単純に可変引数関数(入力または出力とは関係ありません) をコーディングしますか? <stdarg.h>
次に、 headerを慎重に使用します。C では可変引数関数の型付けが不十分であることに注意してください。GCC を使用すると、sentinel 関数に属性を指定できます。たとえば、 MELTを使用して GCC をカスタマイズして、型チェックを追加することもできます。