创建函数利用可变参数列表的形式模拟实现printf的功能

★创建函数利用可变参数列表的形式模拟实现printf的功能。

模拟简单的输入单个字符和字符串时的输出形式

如:输入:%c %c %c %c %c\t%s,‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,"welcome to here!"

输出:h e l l o   welcome to here!

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>    //需引入stdarg的头文件以便建立可变参数列表

void new_printch(char ch)    //对于单个字符处理的函数
{
putchar(ch);       //这里切记不可使用printf的输出形式,不然就没有编写此函数的必要了
}

void my_printstr(char* str)    //对于字符串的输出,调用单个字符输出函数,并使指针不断后移,直到遇到‘\0’,表示一个完整的字符串
{
while (*str)
{
new_printch(*str++);
}
}

void my_print(char* val, ...)  //char*表示了压栈时指针的偏移量,偏移一个字符指针的大小
{
char* vargpch = NULL;
char vargch = 0;
int  vargint = 0;
char *pval = NULL;
va_list vp;    //va_list,va_start,va_end是可变参数列表的表示形式,注意start后的参数,若写错或写反则指针偏移时必然出错,越界取到不可预知的随机值
va_start(vp, val);
pval = val;
while (*pval)
{
if (*pval == ‘%‘)
{
switch (*(++pval))
{
case ‘c‘:    //对于单个字符处理的入口
vargch = va_arg(vp, int);
new_printch(vargch);
break;
case ‘s‘:    //对于字符串处理的入口
vargpch = va_arg(vp, char*);
my_printstr(vargpch);
break;
default:
break;
}
pval++;
}
else
{
new_printch(*pval++);
}
}
va_end(vp);
}

int main()
{
my_print("%c %c %c %c %c\t%s\n",‘h‘,‘e‘,‘l‘,‘l‘,‘o‘,"welcome to here!");
system("pause");
return 0;
}

时间: 2024-08-06 11:57:39

创建函数利用可变参数列表的形式模拟实现printf的功能的相关文章

C利用可变参数列表统计一组数的平均值,利用函数形式参数栈原理实现指针运算

//描述:利用可变参数列表统计一组数的平均值 #include <stdarg.h> #include <stdio.h> float average(int num, ...);//函数原型:即声明 float average2(int num, ...);//num个数 void add(int num, int x, int y, int z); int main(void){ int a=10; int b=20; printf("a地址:%p b地址:%p\n&

C语言函数的可变参数列表

可变参数列表可通过宏来实现,这些宏定义在stdarg.h头文件中,它是标准库的一部分.这个头文件声明了一个类型va_list和三个宏----va_start,va_arg,va_end.可以声明一个类型为va_list的变量,与这几个宏配合使用,访问参数的值.参数列表的可变部分位于一个或多个普通参数(命名参数)的后面(即参数列表中至少要有一个命名参数),它在函数原型中以一个省略号表示. 例如:定义一个函数average可以计算若干个整数的平均值: 1 #include <stdarg.h> 2

【c语言】用可变参数列表实现一个简化的printf函数

//实现一个简化的printf函数. #include <stdarg.h> #include <string.h> void my_printf(const char *str,...) { va_list arg; //准备访问可变参数 va_start(arg,str); while(*str != '\0') { switch(*str) { case 'c': putchar( va_arg( arg,char ) ); break; case 's': puts( va

C语言函数可变参数列表

C语言允许使用可变参数列表,我们常用的printf函数即为可变参数函数,C标准库提供了stdarg.h为我们提供了这方面支持:该头文件提供了一些类型和宏来支持可变参数列表,包括类型va_list,宏va_start.va_arg.va_end: 可变函数参数定义方法: #include <stdarg.h> void func(int count,...){ va_list ap; int ix, tmp; va_start(ap, a); for(ix=0;ix < count; ++

可变参数列表

函数原型:列出了函数期望收到的参数数目及类型,但是它只能显示"固定数目"的参数. 可变参数列表:让一个函数在不同的时刻接受"不同数目"的参数.可变参数列表是通过宏来实现的,这些宏都在stdarg.h这个头文件中,所以使用可变参数列表时要引用头文件#include<stdarg>. 例如:求寻找一组整数中最小的值,因为整数的个数不确定,所以函数在传参的时候也是不确定的,因此需要用到可变参数列表: 利用可变参数列表求最小值:来看看可变参数列表的形式: int

c语言可变参数列表处理

函数参数的传递原理 函数参数在内存中是以栈的形式存取,从右至左入栈. 参数在内存中存放格式: 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减. 总之,函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段.堆栈中,各个函数的分布情况是倒叙的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的 分布情况如

从头认识java-4.8 数组的初始化(2)-可变参数列表

接着上一节,我们这一章节来聊一下数组的另外一个应用:可变参数列表 1.可变参数列表带来的改变 在没有出现可变参数列表的时候,我们一般会使用数组来替代,但是有一个问题,每一次都需要先建立一个数组作为参数,不能动态的形成数组作为参数. package com.ray.ch04; public class Test { public static void printArray(Object[] objects) { for (int i = 0; i < objects.length; i++) {

Effective JavaScript Item 22 使用arguments来创建接受可变参数列表的函数

本系列作为Effective JavaScript的读书笔记. 在Item 21中,介绍了结合apply方法实现的可变参数列表函数average,它实际上只声明了一个数组作为参数,但是利用apply方法,实际上可以接受若干元素作为参数: function averageOfArray(a) { for (var i = 0, sum = 0, n = a.length; i < n; i++) { sum += a[i]; } return sum / n; } averageOfArray.a

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

PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会北京站 课程视频发布 也许对于PHP初级程序员来说,对于PHP函数并不能完全熟练的掌握.我们今天为大家介绍的PHP函数可变参数列表的实现方法主要是利用func_get_args().func_num_args().func_get_arg()这三个系统函数来实现的,其中func_get_args()