C语言中可变形参简单实例
以下程序主要包括三个主要函数:
- 一个最简单的可变形参函数实例;
- 一个简单的printf功能的实例;
- 一个打印字符串函数(辅助);
其中myPrintf函数,实现了printf的部分简单功能,并没有去实现格式化输出操作(%2d %.2f 等),
因为只是它一个实例而已,目的是更好理解掌握可变参数。
后续有兴趣时,我会继续完善的。
/*******************************************************************************************************
* 名 称: main.c
* 功 能:C语言可变形参 variable arguments,典型案例是printf和scanf
实现了一个简单的可变参数函数例子 ShowArgs
实现了一个简单printf功能的函数 myPrintf
* 描 述:可变参数的个数是不确定的
可变参数的类型是不确定的
printf和scanf在实现时,通过前面的%d %f 等获取可变参数的个数和类型
可变参数由定义在stdarg.h头文件中的宏:va_list va_start va_arg va_end等组成
va_list:用于保存参数列表
va_start(v,l):将参数列表的首地址 l 赋值给 v
va_arg(v,l):获取参数列表中类型为 l 的参数的值,并将参数列表指针向后移动到下一个参数处
va_end(v):结束可变参数
* 作 者:JarvisChu
* 时 间:2011-7-17 创建
********************************************************************************************************/
#include <stdio.h>
#include <stdarg.h>
#include <string.h> //在此处选择函数
//#define SHOW_ARGS
//#define MY_PRINTF
#define SHOW_STRING_BY_CHAR //一个简单的实例,num代表可变参数的个数,类型全部默认为double型
void ShowArgs(int num,...){
int i=;
double var;
va_list ls;
va_start (ls,num); //获取可变参数列表的首地址,赋值给ls
printf("-----------%d个可变参数,如下:----------\n",num);
while(i<num){
var = va_arg(ls,double);//返回类型为double的的可变参数值,并使ls指向下一个可变参数
printf("参数%d:%f\n",++i,var);
}
va_end(ls); //结束
printf("\n");
} //实现类似printf的部分功能,利用putchar向屏幕输出字符
void myPrintf(char* str,...){
int i, len;
// int num = 0; //num为可变参数个数 char pre,cur; //前一个字符和当前的字符 va_list ls;
va_start(ls,str); len = strlen(str); //获取字符串长度 pre = ' '; //初始化时,pre为空格(只要不是特殊字符或转义字符就行) for(i=;i<len;i++){
cur = str[i];
switch(pre){
case '%': //前一个字符值是%字符,我们就要考虑%d %f 这种情况了
switch(cur){
case 'd': //%d,输出整数
printf("%d",va_arg(ls,int));//将可变部分的int类型变量替代%d输出,本来很不想在这里用printf的,
break; //但是没有想到其他的办法向屏幕输出一个整型,姑且用printf吧
case 'f': //%f,输出float double类型
printf("%f",va_arg(ls,double));
break;
case 'c': //%c,输出一个字符
putchar(cur);
break;
}
break;
default: //前一个字符不是什么特殊字符
if(cur != '%'){ //当前字符不是%
putchar(cur);
}
break;
}
pre = cur;
}
va_end(ls);
} //辅助函数:将一个字符串,一个字符一个字符的输出
void ShowStringByChar(char* str){
int i, len;
char ch;
len = strlen(str);
for(i=;i<len;i++){
ch = str[i];
putchar(ch);
printf("\n----\n");
}
}
int main()
{
#ifdef SHOW_ARGS
ShowArgs();
ShowArgs(,1.1);
ShowArgs(,1.1,2.2);
#endif #ifdef MY_PRINTF
myPrintf("Jarvis");
myPrintf("\n"); //注意\n \t为一个字符,不要理解成了char[0] = '\' ; char[1] = 'n';
myPrintf("\n");
myPrintf("Jarvis\n");
myPrintf("Jarvis %d\n",);
myPrintf("Jarvis %d\t%d\n",, );
myPrintf("Jarvis %d\t%d\t%f\n",, ,63.2);
#endif #ifdef SHOW_STRING_BY_CHAR
ShowStringByChar("123\t456\n789%d");
# endif
return ;
}
C语言中可变形参简单实例的更多相关文章
- C语言中可变参数的函数(三个点,“...”)
C语言中可变参数的函数(三个点,“...”) 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end ...
- C语言中可变参数的使用
在C语言程序编写中我们使用最多的函数一定包括printf以及很多类似的变形体.这个函数包含在C库函数中,定义为 int printf( const char* format, ...); 除了一个格式 ...
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
- C语言中可变参数的原理——printf()函数
函数原型: int printf(const char *format[,argument]...) 返 回 值: 成功则返回实际输出的字符数,失败返回-1. 函数说明: 使用过C语言的人所再熟悉不过 ...
- C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fu ...
- C语言中可变参数的用法
原文地址: http://blog.csdn.net/wooin/archive/2006/04/29/697106.aspx 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() ...
- java中的反射简单实例
package club.reflection.entity.User; /** * 实体类 * */ public class User { public String name; private ...
- c 中可变参数的实现
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: 例一: int printf( const char* format, ... ...
- c语言中函数参数入栈的顺序是什么?为什么
看到面试题C语言中函数参数的入栈顺序如何? 自己不知道,边上网找资料.下面是详细解释 #include <stdio.h> void foo(int x, int y, int z){ ...
随机推荐
- 转载:【Oracle 集群】RAC知识图文详细教程(四)--缓存融合技术和主要后台进程
文章导航 集群概念介绍(一) ORACLE集群概念和原理(二) RAC 工作原理和相关组件(三) 缓存融合技术(四) RAC 特殊问题和实战经验(五) ORACLE 11 G版本2 RAC在LINUX ...
- expdp/impdp 详细参数解释
任意可以使用expdp/impdp的环境,都可以通过help=y看到帮助文档. 1.expdp参数说明 2.impdp参数说明 3.expdp参数说明(中文) 4.impdp参数说明(中文) expd ...
- TCP三次握手,四次挥手,状态变迁图
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 【css】响应式布局入门【转】
最近研究响应式设计框架的时候,发现网上很多相关的属性介绍,却很少有系统的入门级使用的文章,我自己整理了一篇入门知识,并没有什么高深的理论,也不牵扯到框架. 目前已经越来越多的站点以及wap站点使用响应 ...
- WordCount-个人项目2
我的这个WC程序实现了对txt文件中的数据的计数,算出程序中有多少单词.字符数.行数还有空格数.以及长度. 项目源代码参考:http://www.cnblogs.com/sunbuqiao/p/531 ...
- Linux系统在启动过程中mbr主引导程序被破坏的解决方案
首先,mbr主引导程序被破坏是指系统在启动过程中,磁头找不到/boot分区(windows的启动分区在c盘). 1)下面我们模拟主引导分区被破坏的情况:(在启动分区划分446M的存储大小) 2)重启( ...
- onunload、onbeforeunload事件详解--zhuan
最近项目中做到一个功能:在上传页面用户开始上传文件之后用户点击任意跳转都需要弹出提示层进行二次确定才允许他进行跳转,这样做的目的是为了防止用户的错误操作导致这珍贵的UGC 流失(通常用户在一次上传不成 ...
- 使用fill_n算法
今天使用这个算法来给一个数组赋值,所以把它的使用过程记录下来: fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val.把从起始点开始依次赋予count个元素val的值. 注意 ...
- SQL基础三(例子)
-----------聚合函数使用------------------------ --1.查询student表中所有学生人数 select count(stuno) from student --2 ...
- Java之OO的特性与原则
OO(Object-Oriented)面向对象 面向对象,有三个特性.五个原则之说. 特性 封装 顾名思义,封装就好比一个黑盒子,内部被隐藏,只有几个接口与外界相连.具体来说,所谓封装 ...