一步一步写算法(之 可变参数)
来源:互联网 发布:航天信息软件发票打印 编辑:程序博客网 时间:2024/05/16 07:24
原贴地址:http://blog.csdn.net/feixiaoxing/article/details/6989591
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
可变参数是C语言编程的一个特色。在我们一般编程中,函数的参数个数都是确定的,事先定下来的。然而就有那么一部分函数,它的个数是不确定的,长度也不一定,这中间有什么秘密吗?
其实,我们可以回忆一下哪些函数是可变参数的函数?其实也就是sprintf、printf这样的函数而已。那么这些函数有什么规律吗?关键就是在这个字符串上面。我们可以举一个例子看看,
- void test()
- {
- printf("%s, value = %d\n", "hello", 10);
- }
test函数里面也就是一个简单的打印函数。那么这个函数有什么特别的地方呢,那就是%s、%d和后面的字符是一一对应的,所以有多少个这样的字符,首参数后面就会剩下多少个参数。那么后面参数的地址怎么获取呢?我们可以回想一下,堆栈一般是怎么压栈处理的,
- /*
- * stack space:
- *
- * 参数3 | up
- * 参数2 |
- * 参数1 v down
- */
- void PrintInt(char* buffer, int data, ...)
- {
- return;
- }
- void PrintInt(char* buffer, int data, ...)
- {
- static char space[1024];
- char temp[32];
- int* start;
- int count;
- if(NULL == buffer)
- return;
- memset(space, 0, 1024);
- memset(temp, 0, 32);
- start = (int*) &buffer;
- count = 0;
- while(buffer[count]){
- if(!strncmp(&buffer[count], "%d", strlen("%d"))){
- start ++;
- itoa(*start, temp, 10);
- strcat(space, temp);
- count += 2;
- continue;
- }
- space[strlen(space)] = buffer[count];
- count ++;
- }
- memset(buffer, 0, strlen(buffer));
- memmove(buffer, space, strlen(space));
- return;
- }
- void display()
- {
- char buffer[32] = {"%d %d %d %d\n"};
- PrintInt(buffer, 1, 2, 3, 4);
- printf(buffer);
- }
0 0
- 一步一步写算法(之 可变参数)
- 一步一步写算法(之 可变参数)
- 一步一步写算法(之)
- 一步一步写算法(之)
- 一步一步写算法(之)
- 一步一步写算法(之洗牌算法)
- 一步一步写算法(之 A*算法)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 A*算法)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 算法总结)
- 一步一步写算法(之 A*算法)
- C3P0配置与使用
- 关于android的4.2的0文件夹的详解
- tomcat 安装
- SharePlex for Oracle概述
- 一步一步写算法(之 可变参数)
- POJ 2411 状态压缩DP
- 23种设计模式(4):建造者模式
- xampp 的安装
- Android开发:使用DDMS Heap进行内存泄露调试
- 一步一步写算法(之 最大公约数、最小公倍数)
- BSD套接字(BSD Sockets)
- 程序员走上管理之路-审时度势
- 做移动网站还是移动应用程序?