c语言int val,c语言不定参数与printf函数的实现
今天学习了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函数的实现相关推荐
- c 语言 int argc,C语言深度学习之int main(int argc,char **argv)的理解及延申
C语言深度学习之int main(int argc,char **argv)的理解及延申 前者为可接受 命令行参数,argc表示参数个数, argv[]是参数数组,其中第0个参数是程序本身的名称(包含 ...
- c语言 int转char_c语言的函数指针
简单定义并间接调用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<time.h> void singas ...
- C语言程序设计基础及应用实例---第一节 printf函数的使用
(1)printf函数打印字符串 #include <stdio.h>int main(void) {printf("Helloworld!\r\n");return ...
- C语言中 %md 的输入输出使用(还有printf函数的 %0格式控制符的使用)
今天在牛客网中做了一道题,这道题需要使用%m进行格式控制 下面来讲一下%md 的输入输出的用法 1.%md在输入语句中的使用 通过scanf函数的%m格式控制可以指定输入域宽,输入数据域宽(列数), ...
- C语言int 类型的表示范围 sizeof()函数
一 . 在如今32位和64位的计算机系统中,int类型占32位,其中一位为符号位.占32位int的取值范围为-2147483648-2147483647(). 一些类型的输入输出符号: 1.%d有符号 ...
- c语言 int max,C语言 0x7fffffff是多少(也就是INT_MAX,首位是 0,其余都是1,f代表1111)...
可以算一下 0x7FFFFFFF 是多少 每个十六进制数4bit,因此8位16进制是4个字节,刚好是一个int整型 F的二进制码为 1111 7的二进制码为 0111 这样一来,整个整数 0x7FFF ...
- c语言设置制表符参数,printf()函数的参数和制表符
· 参数 · 控制符 · 转义序列 printf("这是第们学习的第4课"); printf("12345\n6789"); \n 换行 \r 回车键 \b ...
- c语言int作用,c语言中int的用法有哪些
c语言中int的用法有哪些 C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同下面小编给大家整理了c语言中int的用法 ...
- C、C++不定参数的使用
不定参数当年做为C/C++语言一个特长被很多人推崇,但是实际上这种技术并没有应用很多.除了格式化输出之外,我实在没看到多少应用.主要原因是这种技术比较麻烦,副作用也比较多,而一般情况下重载函数也足以替 ...
最新文章
- 推荐2020年度最佳的23个的机器学习项目(附源代码)
- BCH优于BCE+LN的5个理由
- Android 生成keystore,两种方式(转载)
- Android Studio的git功能的使用
- 强大的Mockito测试框架(转)
- 面向睡眠阶段分类的自适应时空图卷积神经网络
- 你知道source map如何帮你定位源码么?
- jdbc mysql demo_JDBC_demo:java连接mysql过程
- api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息
- 如何双启动Linux和Windows
- 做好开源项目 需要坚持
- php 请求值中的魔术字符串
- goback history 传递参数_vue-router go(-1)后退时怎么带参数?
- 无人机如何通过GB28181协议接入视频会议
- 五本最有内容的电子杂志
- 1.0 Android基础入门教程
- Tomcat解惑 之 CATALINA_HOME与CATALINA_BASE
- 【防火墙流控配置 基于主机的带宽控制】
- 软件测试真的是吃青春饭的吗?有哪些建议可以给刚入职的测试员?(全是干货)
- HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?
热门文章
- php可以做门禁卡系统吗_PHP研发工程师入门篇:论PHP可以做什么?
- arcgis python教程视频_arcgispython教程
- Python处理图像五个有趣场景,很实用!
- oracle z中rowid,oracle 10g中的ROWID
- mysql网页后台_MySQL(PHP网站后台数据库)
- 我的世界光影mod怎么用_用“戏剧化”光影艺术 唤醒千年沉睡世界!
- windows 配置C++环境
- 在事务方法中调用另外一个事务方法,被调用方法的事务没起作用
- 钉钉小程序----使用阿里的F2图表
- day23 01 类的命名空间