一、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函数(可变参数)的更多相关文章

  1. C 函数可变参数

    C 函数可变参数 C 语言中用 ... 表示可变参数,例如: void fun(int x ...) 头文件 cstdarg.h 中包含可变参数类型va_list和处理可变参数的三个宏: va_lis ...

  2. printf函数对参数的计算顺序

    没想到啊,没想到: printf函数对参数的计算顺序是从右往左的! 我不禁想问一句,这么坑爹的事情,书里居然没有写过.还是我看书不仔细,没有找到?(回头,在自己翻翻那本c语言编程) 于是下面的程序结果 ...

  3. c#编程基础之函数可变参数

    可变参数:int sum (params int[] values)int sum (string name,params int[] values) 注意:params参数必须是形参表中的最后一个参 ...

  4. PHP函数可变参数列表的具体实现方法介绍

    PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会 ...

  5. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  6. Lua学习笔记3. 函数可变参数和运算符、转义字符串、数组

    1. Lua函数可以接受变长数目的参数,和C语言类似,在函数的参数列表中使用(...)表示函数可以接受变长参数 lua函数将参数存放在一个table中,例如arg,那么#arg可以获得参数的个数 fu ...

  7. C语言函数可变参数列表

    C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏v ...

  8. C语言中函数可变参数解析

    大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...

  9. 【C/C++开发】C语言实现函数可变参数

    函数原型: int printf(const char *format[,argument]...)        返 回 值: 成功则返回实际输出的字符数,失败返回-1.  函数说明:        ...

随机推荐

  1. iOS企业版APP分发上线流程和注意事项

    0.准备 1]$299/year的企业级开发账号. 2]制作分发证书和描述文件,并下载安装到本机. 3]Xcode编译通过,真机测试通过的源码. 1.打包前配置 1]Xcode 打开项目,common ...

  2. NoSql研究报告

    NoSql研究报告 1.概述 随着互联网的不断发展,信息系统的数据变得越来越多,关系型数据库逐渐面临着难以克服的障碍,主要体现在: 对数据库的高并发读写需求 对海量数据的高效率存储和访问需求 对数据库 ...

  3. BOM元素之window对象

    在浏览器中,window对象有双重角色,它既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象.这意味着在网页中定义的任何一个对象.变量和函数,都以wi ...

  4. SerfJ REST

    SerfJ提供了一个MVC架构,但它不包含任何模型,其主要特点是使用控制器collerlor,通过这些collerlor管理REST请求.可帮助你开发优雅的MVC架构的应用,使用惯例重于配置的思路,无 ...

  5. eclipse中注释常用关键字

    关键词列表: @author 作者名 @date 日期 @version 版本标识 @parameter 参数及其意义 @since 最早使用该方法/类/接口的JDK版本 @return 返回值 @t ...

  6. 在Vue中通过自定义指令获取元素

    vue.js 是数据绑定的框架,大部分情况下我们都不需要直接操作 DOM Element,但在某些时候,我们还是有获取DOM Element的需求的: 在 vue.js 中,获取某个DOM Eleme ...

  7. Android性能测试工具Emmagee

    下面介绍一个简单实用的Android性能软件 ~~欢迎加入测试群574875837一起讨论研究 一.Emmagee 简介 Emmagee主要用于监控单个App的CPU,内存,流量,启动耗时,电量,电流 ...

  8. 设置debian的静态IP

    欲设置的信息: IP地址:198.9.146.131 子网掩码:255.255.255.0 网关:198.9.146.254 DNS:198.9.9.1 198.9.9.2 首先编辑/etc/netw ...

  9. 服务器数据库搭建流程(CentOs+mysql)

    前言: 服务器上数据库搭建需要知道Linux系统的版本,以前的Ubuntu14.04直接在终端下输入apt-get install (package)便可方便的下载并安装mysql,但是在centOs ...

  10. Web平台安装及检测程序

    软件名称:microsoft web platform installer 上图: 可以看做是一个App Store, 你再也不用东奔西跑去找什么开发软件,CMS等等了,直接打开这个,勾选上就安装吧, ...