如何在结构中加入参数?

时间:2013-11-16 12:18:02

标签: c struct segmentation-fault printf

你好我正在创建一个xx_printf函数,并且在一个名为find_correspondence的函数中,我有太多的参数所以我认为我可以创建一个结构并只调用*结构但是当我试图在xx_printf函数中调用find_correspondence我'我得到了一个段落错误!怎么能解决这个问题呢。

int     find_correspondance(char *format, char *tab_sign, ptr_fonc *tab_func, int i, va_list ap)
{
  int           a;

  a = 0;
  while ((format[i] != tab_sign[a]) && tab_sign[a] != '\0')
      a = a + 1;
  if (tab_sign[a] == '\0')
      {
        my_putchar('%');
        my_putchar(format[i]);
      }
  else
    tab_func[a](ap);
  return (i);
}

int     my_printf(char *format, ...)
{
  va_list       ap;
  ptr_fonc      *func_tab;
  char          *flag_tab;
  int           i;

  va_start(ap, format);
  func_tab = tab_func(func_tab);
  flag_tab = tab_sign(flag_tab);
  i = 0;
  while(format[i] != '\0')
    {
      if (format[i] == '%')
        {
          i += 1;
          if (format[i] == '%')
            my_putchar('%');
          else if (format[i] == '\0')
            return ;
          else
            **find_correspondence(format, flag_tab, func_tab, i, ap);**
        }
      else
        my_putchar(format[i]);
      i++;
    }
  va_end(ap);
}

find_correspondence(format,flag_tab,func_tab,i,ap); 有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

我认为问题可能是您在参数列表中的结构名称va_list之前错过了“struct”。它应该如下所示:

find_correspondance(char *format, char *tab_sign, ptr_fonc *tab_func,
                            int i, ***struct***   va_list ap)

而且,这里有一个小程序可能会被用作先例。

#include <stdio.h>
#include <string.h>

struct namect{
   char fname[20];
   char lanme[20];
   int letters;
};

struct namect getinfo(void);
struct namect makeinfo(struct namect);
void showinfo(struct namect);

int main(void){
   struct namect person;
   person=getinfo();
   person=makeinfo(person);
   showinfo(person);

   getchar();
   return 0;
}

struct namect getinfo(void)
{
   struct namect temp;
   printf("Please enter your first name.\n");
   gets(temp.fname);
   printf("Please enter your last name.\n");
   gets(temp.lanme);
   return temp;
}

struct namect makeinfo(struct namect info)
{
   info.letters=strlen(info.fname)+strlen(info.lanme);
   return info;
}

void showinfo(struct namect info)
{
   printf("%s %s,your name contains %d letters.\n",info.fname,info.lanme,info.letters);
}

答案 1 :(得分:0)

对于va_arg的一些实现......

可能会发生的事情是,每次循环时你应该做一个va_start。 如果你在tab_funca中使用va_arg;呼叫,args将全部读取,并在下一次循环不是他们是第一次,即垃圾。