欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c语言不定参数与printf函数的实现

程序员文章站 2022-04-23 17:07:47
 今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list()、va_start()、va_end...
 今天学习了C语言不定参数,C语言中的不定参数主要靠<strarg.h>这个头文件实现,这个头文件包含了va_list()、va_start()、va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访问参数列表未确定的部分。这个变量是由va_start来初始化的。它的第一个参数是va_list的变量名,第二个参数是省略号前最后一个有名字的参数。初始化过程把va_list的变量设置为指向可变参数的第一个参数。

    为了访问参数,需要使用va_arg,这个宏接受两个参数(va_list变量和参数列表中下一个参数的类型)访问完最后一个参数,需要调用va_end(),其格式如下:

 

void fun(int a,...)
{
va_list parameter;
va_start(parameter, a);
va_arg(parameter, int );
}

 

 

    举个例子,如果要实现求多个数的平均值,因为C中不允许默认参数,所以只能用上述方法进行求平均数,代码如下

 

int average(int val, ...)
{
va_list arg;
int sum = 0;
int i = 0;
va_start(arg, val);
//va_arg();
for (i = 0; i < val; i++)
{
sum += va_arg(arg, int);//每调用一次向下取一个
}
va_end(arg);
return sum / val;
}

 

 

  如果要求多个数的最大值可以写为

 

int average(int val, ...)
{
va_list arg;
int max;
int sum = 0;
int i = 0;
va_start(arg, val);
for (i = 0; i < val; i++)
{
sum = va_arg(arg, int);
if (sum>max)
max = sum;
}
va_end(arg);
return max;
}

 

 

  由此我们还可以用stdarg这个宏来模拟printf函数的实现,这里我只是做了模拟了字符串输出,整形与字符型输出代码如下:

 

#include<stdio.h>
#include<stdarg.h>
void printd(int n)//把整形按字符型输出
{
if (n < 0)
{
putchar('-');
}
if (n)
{
printd(n /10);
putchar(n % 10 + '0');
}
}
void my_printf(char* val,...)
{
int ch;
va_list arg;
va_start(arg, val);
while (*val != '\0')
{
switch (*val)
{
case '%':            //遇到%执行switch case语句
{
if (*(val + 1) == 'c')//输出字符
{
ch = va_arg(arg, char);
putchar(ch);
val++;                //指针变量向下偏移一个单位
}
else if (*(val + 1) == 'd')
{
ch = va_arg(arg, char);//输出整形
printd(ch);
val++;
}
else if (*(val + 1) == 's')//输出字符串
{
char*p = va_arg(arg, char*);
while (*p != '\0')
{
putchar(*p);
p++;
}
val++;                //指向头一变量的下一个字符
}
else
putchar('%');
break;
}
default:
{
    putchar(*val);
break;
}
}
val++;
}
va_end(arg);
}
int main()            //程序调试
{
int c =100 ;
char*p = "laomasb";
char a = 'c';
my_printf("%s\n%d\n%c\n", p, c,a);
system("pause");
return 0;
}

 

 

    这里写得还差很多,比如说%后面加数字的话是没办法识别并且寇冲输出空间的,而且这代码自己看着就比较low。希望大神给出些建议。