用可变参数列表实现简单的printf函数
程序员文章站
2022-06-03 13:15:03
...
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdarg.h>
void print_num(int n)
{
if (n > 9)
print_num(n / 10);
putchar(n % 10+'0');
}
void print(char* format, ...)
{
va_list arg;
va_start(arg, format);
while (*format)
{
switch (*format)
{
case 's':
{
char *str = va_arg(arg, char *);
while (*str)
{
putchar(*str);
str++;
}
}
break;
case 'c':
putchar(va_arg(arg, char));
break;
case 'd':
print_num(va_arg(arg, int));
break;
default:
putchar(*format);
break;
}
format++;
}
va_end(arg);
}
int main()
{
print("s ccc d.\n", "hello", 'b', 'i', 't',100);
system("pause");
return 0;
}
在执行此函数时,函数在栈帧中如下图所示存储:
在调用print函数是先将“s ccc d.\n”这个字符串首字符地址传过去,根据此地址用va_arg找到下面几个内存块中的内容。
在打印整形数字100时,由于putchar输出的是字符所以在所要输出的数字后面加上‘0’(字符0);打印字符串时需要用putchar而不用puts,因为puts输出一行后自动换行。
注意:在使用va_arg时,所传类型与相对应的内存块中存储的数据类型一致!
(关于va_list,va_start,va_arg,va_end这几个宏又不懂的可以参照上上篇博客哦)
上一篇: php查询数据库,该如何处理
下一篇: 具有时效性的php加密解密函数代码