【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. 函数说明: ...
随机推荐
- Java-8ATM
源代码: import java.util.Scanner;interface fangfa{ public void show();public void qukuan();public void ...
- elasticsearch-5.2在windows下的安装方法
elasticsearch-5.2.1安装方法 1. 安装java 下载安装java jdk 1.7 以上 配置java环境变量 右击[我的电脑]---[属性]-----[高级系统设置]---[环境变 ...
- [傻瓜版] Redis在Windows下的开发环境配置步骤
redis默认运行在unix体系下,windows无法直接运行官方版.以下是几种解决方案, 一)Windows移植版.启动速度飞快,优先推荐使用. a) 2.6.12 是稳定版,我用64位版来做开发环 ...
- Java String类和Object类
String类: 方法: 1.charAt(int index):取index下标的char类型值 2.endsWith(String prefix) /startsWith(String prefi ...
- [Hadoop] - Win7下提交job到集群上去
一般我们采用win开发+linux hadoop集群的方式进行开发,使用插件:hadoop-***-eclipse-plugin. 运行程序的时候,我们一般采用run as application或者 ...
- devexpress显示缓冲滚动条与实现类似QQ消息推送效果
1.一般在项目中处理大数据,或者查询大量数据时,耗时会很长,这个时候缓冲条是必不可少的.这里展示一个devexpress不错的缓冲条,如图所示: 使用到了控件splashScreenManager,运 ...
- mysql 常用命令集锦
Mysql安装目录数据库目录/var/lib/mysql/配置文件/usr/share/mysql(mysql.server命令及配置文件)相关命令/usr/bin(mysqladmin mysqld ...
- ERP库位分布看板(库位管理)
客户正在使用的看板管理,根据厂家需求,做的二次开发. 一:看板效果 二:客户需求 1.客户需求:XX是一家汽车零部件(胶管,硅胶管等)的生产厂家,因此对原料,半成品的有效期有严格的要求. 多次调研得知 ...
- connect函数的用法
无论流式套接字(如TCP)还是数据报(如UDP),均可以使用connect函数.对于流式套接字,使用connect函数后,建立固定地址的连接,之后可以使用send/rev函数进行数据收发.对于数据报, ...
- “使用多target来构建大量相似App”,唐巧大神理论验证(附工程代码地址)
无意间看到巧神的文章时,感觉非常兴奋,此文章正好解决了公司目前项目的痛点. 读到以下关键一段时,不甚明了,故自己做了实验分享给有缘人. "我们的每个课程的资源文件都具有相同的文件名,例如首页 ...