[C/C++入门][printf输出]5、详解C语言和C++中的printf输出

printf("Hello World!");

printf是一种在C语言中用于格式化输出的函数。它是C标准库(stdio.h头文件中)提供的一部分。

是每一个学习C语言(除非你从C++开始学)肯定会接触的输出函数。在大部分教程中都会教大家printf函数是如何使用,举个例子。

int a = 50;printf("OutPut :%d",a);

这样子我们就可以把变量50给输出来啦。

老师肯定说过,printf的第一个参数是输出的语句,其中会有例如%d说明后面读取的第一个变量的类型是整型,同样的,我们可以输出多个不同类型的变量。

以下是一些常见的格式说明符:

  • %d: 用于输出整数。
  • %f: 用于输出浮点数。
  • %c: 用于输出字符。
  • %s: 用于输出字符串。

1. printf函数使用公式

在做题中,我们使用了printf函数了。

这一节,我们先复习一下printf的使用公式,然后再来详细讨论一下它。

printf函数的使用公式:

printf("XXX占位1 XXX 占位2 XXX占位3", 替换1, 替换2, 替换3);

根据公式,我们写出以下示例代码。

#include <stdio.h>
int main()
{
    int a = 1;
    float b = 2.345;
    char c = 'a';
    printf("整型a为%d 浮点b为%f 字符c为%c 字符c对应的ASCII码为%d", a, b, c, c);
    return 0;
}

让我们从以下5点详细分析一下printf的用法:

  1. printf是一个变参函数。(参数的数量和类型不确定)
  2. printf的第一个参数是字符串。
  3. printf的第一个参数是需要输出的字符以及需要被替换的占位符。
  4. printf的第二及后续参数将依次替换占位符。
  5. 占位符的类型和数量需要与后续的参数类型和数量对应。

1.1 printf是一个变参函数

也就是说它的参数个数是不确定的,同时参数类型也是不确定的。

事实上,printf函数只有一个固定参数和...不固定数量的可变参数组成。

所以printf函数真正重要的参数就是第一个字符串,而且他的输入参数就是一个字符串!这意味着,我们可以用一个string 类型的字符串变量来作为它的参数。

("%d", 1);                    //  两个参数
printf("%d %f", 1, 2.3);            //  三个参数
printf("%d %f %c", 1, 2.3, 'H');    //  四个参数

1.2 第一个参数必须字符串


 


 

1.3 第一个参数包含需要输出的字符以及需要被替换的占位符


 


 

这个字符串包含了需要输出的字符,以及需要被替换的占位符。

1.4 第二及后续参数将依次替换占位符


 


 

1.5 占位符的类型和数量需要与后续的参数类型和数量对应


 


 

2. 整型类型的占位符

在前面的printf函数的使用当中,我们一直将%d作为整型int类型的占位符。对于其他的整型类型,它们的占位符分别都是什么呢?

printf是一个可变参数函数,在C语言中将参数传入函数的可变参数中,变量会发生自动类型提升。

2.1 有符号整型的类型提升

对于有符号位的整型char,short,传入printf的可变参数时,会被提升为int。而比int更高级的整型则不发生变化。


 


 

所以,在处理char,short,int时,均可使用%d来占位。

而在Visual Studio中int与long的范围一致,按理来说也可以使用%d来占位。

但是为了程序的可移植性,在切换到别的平台下时,int和long有可能不一致。

所以,请使用%ld来为long占位。更高级的long long则需要使用%lld来占位。


结论: char,short,int使用%d。 long使用%ld。 long long使用%lld

2.2 无符号整型的类型提升

对于无符号位的整型unsigned char,unsigned short,传入printf的可变参数时,会被提升为unsigned int。

而比unsigned int更高级的整型则不发生变化。


 


 

对于无符号整型,需要将d替换成u表明最高位不被看作符号位,而是数据位。


结论: unsigned char,unsigned short,unsigned int使用%u。 unsigned long使用%lu。 unsigned long long使用%llu


2.3 浮点类型的类型提升

float会被提升为double,double不发生变化。


结论: float,double均使用%f

3、浮点类型的保留任意位小数、左右对齐补0

一、保留n位小
 


 

格式:printf("%.nf",num);

解释:

百分号说明符之间插入 .n(n为想要保留小数的位数)


 

特殊的:
 

printf("%.f",num);

只有一个点,没有数字,表示保留整数。


 


 

二、输出右对齐

格式:printf("%nd",num);

解释:

只写数字 n ,表示输出的位数,靠右对齐,位数不足的在前面补上空格。


 


 

三、输出左对齐


 

格式:printf("%-nd",num);

解释:

数字 n 前加上负号,表示左对齐,数字表示输出位数,不足的在后面补上空格。


 


四、补0

方法1:

格式:printf("%0nd",num);

解释:

在数字 n 前面加上0,数字表示输出位数,不同之处在于对齐后,不足的位置不再是空格,而是补 0

代码示例:

int main()

{

printf("%06d\n",66);

}

输出结果: 000066

方法2:

格式:printf("%0*d",n,66);

解释:将数字 n 的位置移动到后方,原有位置写上 * ,最终效果与方法1相同。

小贴士:以上方法可以进行一定程度的结合,从而达到自己需要的输出效果。

备注:此文只有少部分原创,因为我发现有大佬写的比我好,没有必要重复造轮子。因此如果侵权了,请联系我删掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值