【C语言】模拟实现printf函数(可变参数)
一、printf函数介绍
printf功能
printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息。
printf原型
int printf( const char* format , [argument] ... ); //定义在stdio.h中
以上部分来自于高小调博客(一个UI非常好,没有广告,纯绿色的博客,建议大家收藏)
二、利用可变参数列表模拟实现printf
1.分析printf函数
printf("Hello haohaosong!\n");
printf("%s","Welcome to my bolg\n");
printf("hell%c\n",'o');
我们发现,printf函数的参数是不确定的
传参的地方必须使用其他东西
2.解决方法
利用stdarg宏来解决可变参数问题
头文件:<stdarg.h>
va_list;
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr, prev_param ); (ANSI version)
在VC6.0下,我们转到定义出,可以清晰发现这些宏的定义:
分析
va_list 是用宏定义的标识符,是指向字符类型的指针
va_start(ap,v) 取出va_list 定义的变量的地址,并加上可变元素的数目
va_arg(ap,t) 每次取指针指向的内容,并在宏的内部将指针后移
va_end(ap) 将原指针指向空,以防止野指针的出现
三、具体代码
代码块:
#include<stdio.h>
#include<stdarg.h>
int my_printf(char* str,...)
{
va_list arg;//定义char* 变量 arg
int count = 0;
char* str_tmp = NULL;
va_start(arg,str);//为arg进行初始化
while(*str != '\0')
{
switch(*str)
{
case 'c':
putchar(va_arg(arg,int));//取下一个参数的字符,并打印
count++;
break;
case 's':
str_tmp = (char*)va_arg(arg,int);//取下一个参数的地址,因为这个是字符串
while(*str_tmp != '\0')//利用解引用进行输出
{
putchar(*str_tmp);
count++;
str_tmp++;
}
break;
default:
putchar(*str); //不为'c'或's',那么直接将它打印
count++;
break;
}
str++;
}
va_end(arg);//将arg指向空,防止野指针
return count;
}
int main()
{
my_printf("s ccc","hello",'H','h','s');
return 0;
}
运行结果:
【C语言】模拟实现printf函数(可变参数)的更多相关文章
- C 函数可变参数
C 函数可变参数 C 语言中用 ... 表示可变参数,例如: void fun(int x ...) 头文件 cstdarg.h 中包含可变参数类型va_list和处理可变参数的三个宏: va_lis ...
- printf函数对参数的计算顺序
没想到啊,没想到: printf函数对参数的计算顺序是从右往左的! 我不禁想问一句,这么坑爹的事情,书里居然没有写过.还是我看书不仔细,没有找到?(回头,在自己翻翻那本c语言编程) 于是下面的程序结果 ...
- c#编程基础之函数可变参数
可变参数:int sum (params int[] values)int sum (string name,params int[] values) 注意:params参数必须是形参表中的最后一个参 ...
- PHP函数可变参数列表的具体实现方法介绍
PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会 ...
- Python函数可变参数*args及**kwargs详解
初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...
- Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组
1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...
- C语言函数可变参数列表
C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏v ...
- C语言中函数可变参数解析
大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...
- 【C/C++开发】C语言实现函数可变参数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: ...
随机推荐
- find查找命令
find # 格式 find [路径] [参数] [表达式] -exec 指令 {} \ ; -{} 代表find找到的文件 -\ 禁止转意 : 表示本行指令结束 # find /sbin -type ...
- php文件上传分类
<?php/** * 文件上传类 * @author lijiamin * @time 2017-02-17 * @email 1195989301@qq.com */class Upload{ ...
- .net是最牛逼的开发平台没有之一
.net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开发平台没有之一 .net是最牛逼的开 ...
- DevExpress 控件使用之GridControl基本属性设置
DEV控件:gridControl常用属性设置 1.隐藏最上面的GroupPanel(实现方法两种) ①代码实现:gridView1.OptionsView.ShowGroupPane ...
- 【转】Java通过IText导出word和pdf
原帖地址:http://blog.csdn.net/zwx19921215/article/details/34439851 最近做的项目中需要用到把Highcharts图表导出word和pdf的功能 ...
- FineUIMvc随笔 - 动态创建表格列
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户需求 用户希望实现动态创建表格列,在 WebForms 中,我们通过在 Page_Init 中创建列来实现: 但是在 MVC ...
- PCB行业ERP解决方案
普实PCB管理系统包括PCB企业从接到订单开始,编排生产计划.制作工程指示.生产工具.准备物料.品质保障.工序生产.设备维护等一系列与企业运作密切相关的环节,使得企业的各个部门能够紧密联系.相互协调, ...
- Phpcms 详情页显示所属栏目的同级栏目
Phpcms详情页是不显示所属栏目的同级栏目的,如果按下面的方式 {loop subcat($parentid) $v} <li{if $v[catid]==$catid} class=&quo ...
- GCD浅析
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 } span.s1 { } 1.关于GCD ...
- JAVA: List用法
1.List中可以添加任何对象,包括自己定义的新的类. class Person{.....}上面定义了一个Person类,下面看好如何使用ListPerson p1=new Person();Per ...