今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list()、va_start()、va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访问参数列表未确定的部分。这个变量是由va_start来初始化的。它的第一个参数是va_list的变量名,第二个参数是省略号前最后一个有名字的参数。初始化过程把va_list的变量设置为指向可变参数的第一个参数。

为了访问参数,需要使用va_arg,这个宏接受两个参数(va_list变量和参数列表中下一个参数的类型)访问完最后一个参数,需要调用va_end(),其格式如下:void fun(int a,...)

{

va_list parameter;

va_start(parameter, a);

va_arg(parameter, int );

}

举个例子,如果要实现求多个数的平均值,因为C中不允许默认参数,所以只能用上述方法进行求平均数,代码如下int average(int val, ...)

{

va_list arg;

int sum = 0;

int i = 0;

va_start(arg, val);

//va_arg();

for (i = 0; i

{

sum += va_arg(arg, int);//每调用一次向下取一个

}

va_end(arg);

return sum / val;

}

如果要求多个数的最大值可以写为int average(int val, ...)

{

va_list arg;

int max;

int sum = 0;

int i = 0;

va_start(arg, val);

for (i = 0; i

{

sum = va_arg(arg, int);

if (sum>max)

max = sum;

}

va_end(arg);

return max;

}

由此我们还可以用stdarg这个宏来模拟printf函数的实现,这里我只是做了模拟了字符串输出,×××与字符型输出代码如下:#include

#include

void printd(int n)//把×××按字符型输出

{

if (n

{

putchar('-');

}

if (n)

{

printd(n /10);

putchar(n % 10 + '0');

}

}

void my_printf(char* val,...)

{

int ch;

va_list arg;

va_start(arg, val);

while (*val != '\0')

{

switch (*val)

{

case '%':            //遇到%执行switch case语句

{

if (*(val + 1) == 'c')//输出字符

{

ch = va_arg(arg, char);

putchar(ch);

val++;                //指针变量向下偏移一个单位

}

else if (*(val + 1) == 'd')

{

ch = va_arg(arg, char);//输出×××

printd(ch);

val++;

}

else if (*(val + 1) == 's')//输出字符串

{

char*p = va_arg(arg, char*);

while (*p != '\0')

{

putchar(*p);

p++;

}

val++;                //指向头一变量的下一个字符

}

else

putchar('%');

break;

}

default:

{

putchar(*val);

break;

}

}

val++;

}

va_end(arg);

}

int main()            //程序调试

{

int c =100 ;

char*p = "laomasb";

char a = 'c';

my_printf("%s\n%d\n%c\n", p, c,a);

system("pause");

return 0;

}

这里写得还差很多,比如说%后面加数字的话是没办法识别并且寇冲输出空间的,而且这代码自己看着就比较low。希望大神给出些建议。

c语言int val,c语言不定参数与printf函数的实现相关推荐

  1. c 语言 int argc,C语言深度学习之int main(int argc,char **argv)的理解及延申

    C语言深度学习之int main(int argc,char **argv)的理解及延申 前者为可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含 ...

  2. c语言 int转char_c语言的函数指针

    简单定义并间接调用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> void singas ...

  3. C语言程序设计基础及应用实例---第一节 printf函数的使用

    (1)printf函数打印字符串 #include <stdio.h>int main(void) {printf("Helloworld!\r\n");return ...

  4. C语言中 %md 的输入输出使用(还有printf函数的 %0格式控制符的使用)

    今天在牛客网中做了一道题,这道题需要使用%m进行格式控制 下面来讲一下%md 的输入输出的用法 1.%md在输入语句中的使用 通过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数), ...

  5. C语言int 类型的表示范围 sizeof()函数

    一 . 在如今32位和64位的计算机系统中,int类型占32位,其中一位为符号位.占32位int的取值范围为-2147483648-2147483647(). 一些类型的输入输出符号: 1.%d有符号 ...

  6. c语言 int max,C语言 0x7fffffff是多少(也就是INT_MAX,首位是 0,其余都是1,f代表1111)...

    可以算一下 0x7FFFFFFF 是多少 每个十六进制数4bit,因此8位16进制是4个字节,刚好是一个int整型 F的二进制码为 1111 7的二进制码为 0111 这样一来,整个整数 0x7FFF ...

  7. c语言设置制表符参数,printf()函数的参数和制表符

    · 参数 · 控制符 · 转义序列 printf("这是第们学习的第4课"); printf("12345\n6789"); \n  换行 \r  回车键 \b ...

  8. c语言int作用,c语言中int的用法有哪些

    c语言中int的用法有哪些 C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同下面小编给大家整理了c语言中int的用法 ...

  9. C、C++不定参数的使用

    不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多.除了格式化输出之外,我实在没看到多少应用.主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替 ...

最新文章

  1. 推荐2020年度最佳的23个的机器学习项目(附源代码)
  2. BCH优于BCE+LN的5个理由
  3. Android 生成keystore,两种方式(转载)
  4. Android Studio的git功能的使用
  5. 强大的Mockito测试框架(转)
  6. 面向睡眠阶段分类的自适应时空图卷积神经网络
  7. 你知道source map如何帮你定位源码么?
  8. jdbc mysql demo_JDBC_demo:java连接mysql过程
  9. api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
  10. 如何双启动Linux和Windows
  11. 做好开源项目 需要坚持
  12. php 请求值中的魔术字符串
  13. goback history 传递参数_vue-router go(-1)后退时怎么带参数?
  14. 无人机如何通过GB28181协议接入视频会议
  15. 五本最有内容的电子杂志
  16. 1.0 Android基础入门教程
  17. Tomcat解惑 之 CATALINA_HOME与CATALINA_BASE
  18. 【防火墙流控配置 基于主机的带宽控制】
  19. 软件测试真的是吃青春饭的吗?有哪些建议可以给刚入职的测试员?(全是干货)
  20. HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?

热门文章

  1. php可以做门禁卡系统吗_PHP研发工程师入门篇:论PHP可以做什么?
  2. arcgis python教程视频_arcgispython教程
  3. Python处理图像五个有趣场景,很实用!
  4. oracle z中rowid,oracle 10g中的ROWID
  5. mysql网页后台_MySQL(PHP网站后台数据库)
  6. 我的世界光影mod怎么用_用“戏剧化”光影艺术 唤醒千年沉睡世界!
  7. windows 配置C++环境
  8. 在事务方法中调用另外一个事务方法,被调用方法的事务没起作用
  9. 钉钉小程序----使用阿里的F2图表
  10. day23 01 类的命名空间