0

私はCが初めてで、複数の入力に関する助けが欲しいです。たとえば、次の構造体があります。

typedef struct person{
    char * name;
    int age;
  }

:name age name age name age を取得する関数を書きたいと思います...それを行う方法はありますか? 後で値を取得するにはどうすればよいですか?

私は次のようなことを意味します:

void my_func(char* name, int age , char* name1,int age1.....)

JAVAのように「...」を使用できます。そのようなことをしたい:

void my_func(char* name, int age , char* name1,int age1.....){ 
  int num_of_ppl = length of the input/2
  person p1 ;
  p1.name = first input name
  p1.age = first input age

等..

ありがとう!

4

3 に答える 3

1

vararg機能はstdarg.h次の場所で使用できます。

//
// First argument specifies the number of name/age pairs supplied
//
void my_func(int persons, char *name1, int age1, ...) {
  int age, i;
  char *name;
  va_list vl;
  va_start(vl, age1);

  for (i = 1; i < persons; i++) {
    name = va_arg(vl, char*);
    age = va_arg(vl, int);
    // Do something with the values
  }

  va_end(vl);
}
于 2012-07-28T08:59:52.073 に答える
0

可変引数リストを持つ関数が必要な場合は、va_listを使用できます

#include <cstdarg>
using namespace std;
void myFunction(int num, ...)
{
    va_list arguments;                           // A place to store the list of arguments
    va_start ( arguments, num );                 // Initializing arguments to store all values after num
    for ( int x = 0; x < num; x++ )              // Loop until all numbers are added
        func(va_arg ( arguments, person ));      // get next value of argument and call a function
    va_end ( arguments );                        // Cleans up the list

}
于 2012-07-28T09:03:46.987 に答える
0

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 をカスタマイズして、型チェックを追加することもできます。

于 2012-07-28T08:54:05.857 に答える