04-C语言入门基础(格式化输出函数printf)
一.printf函数
实际上我们在写第一个Hello,World!的时候就已经开始使用printf函数了,实际上这个函数来自于标准输入输出库(stdio:standard input/output)
它的函数原型如下:
int printf(const char * restrict format, ...);
format参数表示是一个格式串,而后面的...则表示变长参数,关于变长参数我后面会举例说明。
format很明显可以看出,这是一个字符串常量,这个字符串常量中可以放任意你想输出的字符或字符串,另外还可以放入一些格式占位符
关于格式占位符:
%i或%d:输出int类型的数据
%hd或%ld:输出short int或long int
%u:输出unisgned int
%f:输出float或double类型(注意:这个在输出时会有尾随的0)
%g:输出float或double(只不过这个在输出时就没有尾随的0了)
%c:输出char字符
%s:输出字符串(无论是字符串常量还是字符串变量都可以)
%p:输出地址类型(实际上就是16进制的地址[带有0x前缀])
%x:输出16进制
%o:输出8进制
1 #include<stdio.h> 2 int main() 3 { 4 int i = 20; 5 unsigned int ui = 10; 6 short int si = 5; 7 float f = 3.14;//注意,3.14这个字面量是double类型哦 8 double d = 3.14f;//带f后缀的是float类型哦 9 const char*str = "Hello,World!";//这是一个字符串常量 10 char c = 'A'; 11 printf("i = %d\n",i); 12 printf("ui = %u\n",ui); 13 printf("si = %hd\n",si); 14 printf("f = %f\n",f); 15 printf("d = %.2f\n",d);//d是一个浮点数,如果是%.2f则表示只取到小数点后两位数 16 printf("d = %g\n",d);//%g输出的浮点数是没有0后缀的 17 printf("c = %c\n",c);//字符输出 18 printf("str = %s\n",str);//字符串输出 19 printf("i(Hex) = %x\n",i);//将i用其16进制输出 20 printf("i(oct) = %o\n",i);//将i用其8进制输出 21 printf("&i = %p\n",&i);//地址类型用%p输出 22 return 0; 23 }
我们刚刚说了,%表示格式占位符,那么我如果有这样的需求,我要输出百分百怎么办?(写两个%%就行了)
printf("MB=%d%%\n",25);
二.可变长参数...
我们无论是使用printf还是后面要学scanf,他们都有一个可变长参数,那么,看起来这种可变长参数非常的好用,我们也可以来实现一个可变长参数
来取得某组数据中的最大值
1 #include<stdio.h> 2 #include<stdarg.h> 3 //使用可变长参数来设计一个max函数,用它来取得一组整数中的最大值 4 int max(int cnt,...)//cnt表示我要传入几个数(然后我传入这些数,然后取得他们的最大值) 5 { 6 int i; 7 int max_var; 8 va_list v_l; 9 va_start(v_l,cnt);//用来开始一个可变长参数列表(这里表示我要从cnt之后的参数才是我的可变长参数列表) 10 max_var = va_arg(v_l,int);//va_arg用来取出可变长参数列表中的一个数据,它如果再调用一次,那么参数就会取到下一个了 11 for(int i = 1;i<cnt;i++)//这个for循环条件是i=1(因为我已经取了一个了) 12 { 13 int data = va_arg(v_l,int);//va_arg表示我要从v_l这个变长参数表里面取一个值,而且这个值的类型是int类型的 14 if(data>max_var) 15 { 16 max_var = data; 17 } 18 } 19 va_end(v_l);//结束一个可变长参数列表 20 return max_var; 21 } 22 //可能对va_arg不是很清楚,这里再说明一下 23 void some_arg(int st,...) 24 { 25 va_list la; 26 va_start(la,st);//开始一个可变长参数列表 27 int arg1 = va_arg(la,int);//取一个int类型的数据 28 printf("arg1:%d\n",arg1); 29 char arg2 = va_arg(la,int);//取一个整数(当做字符来输出) 30 printf("arg2:%c\n",arg2); 31 char* arg3 = va_arg(la,char*);//取一个字符串 32 printf("arg3:%s\n",arg3); 33 //实际上,每当我调用一次va_arg,那么参数就会相应的往后取一次(相当于在遍历) 34 va_end(la); 35 } 36 int main() 37 { 38 printf("max=%d\n",max(5,11,23,10,34,22)); 39 printf("max=%d\n",max(4,11,23,10,22)); 40 printf("max=%d\n",max(3,11,23,22)); 41 some_arg(3,55,'A',"Hello"); 42 return 0; 43 }

浙公网安备 33010602011771号