0

我是 C 的新手,很想得到一些关于多输入的帮助,例如我有这个结构:

typedef struct person{
    char * name;
    int 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

ETC..

谢谢!

4

3 回答 3

1

您可以在以下位置使用可变参数功能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

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_persondestroy_person适当调用的约定。

我可能误解了你的问题。您想简单地编写一个可变参数函数(与输入或输出无关)吗?然后小心使用<stdarg.h>header。请注意,可变参数函数在 C 中的类型很差。使用 GCC,您可以提供标记函数属性,您甚至可以自定义 GCC,例如使用MELT来添加一些类型检查。

于 2012-07-28T08:54:05.857 回答
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 回答