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 }

 

 

      

    

posted @ 2023-05-09 21:15  蜡笔小新Pointer  阅读(175)  评论(0)    收藏  举报