⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 self_printf.c

📁 实现printf功能的变长函数程序
💻 C
字号:
/*************************实现printf功能***************************/
#include <stdio.h>


typedef char * va_list;

#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1))
//#define _INTSIZEOF(n) ((4+4-1)&~(4 - 1))
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

#define va_end(ap) ( ap = (va_list)0 )

#define NULL 0

void self_printf(char *, ... );

int main(void)
{
int a=1;
char *b="bbb";
self_printf("This is %d,is %s!\n",a,b);
//exit(exit_SUCCESS);
return 0;
}

/* ANSI标准形式的声明方式,括号内的省略号表示可选参数 */
void self_printf( char *msg, ... )
{
va_list ap; /* 定义保存函数参数的结构 */
char *para=NULL; /* 存放取出的字符串参数 */
va_start(ap, msg); /* 栈操作 */
para=va_arg(ap, char *); /*取出当前的参数,类型为char *. */
do
 {
if(*msg!='%'){/* 采用空串指示参数输入结束 */
 putchar(*msg++);
 }else {
 switch(*++msg)
   {
   case 'd':
     printf("%d", para);
     para=va_arg(ap, char *);
     msg++;
     break;
   case 's':
     printf("%s", para);
     para=va_arg(ap, char *);
     msg++;
     break;
   default:
     putchar(*msg);
     break;
   }
 }
}while(*msg!='\0');
va_end(ap); /* 将argp置为NULL */
}

/********************************************
This is 1,is b!
********************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -