C语言:printf()

printf()用来格式化字符串

printf(格式串,表达式1,表达式2,······)

格式串是必须要传入的值,而后面的表达式只是根据需求追加的

格式串:也就是我们要显示的字符串,格式串可以是存粹的字符串常量,或者含有转换符的字符串常量

转换符:转换符就是打印格式串的占位字符,以%开头,%与后面的字母指定了将后面的表达式从二进制转化为字符的方式

表达式n:表达式是我们想插入在字符串中的自适应内容,从左到右依次替换到转换符上,它可以是变量,也可以为一些复杂的表达式

#include <stdio.h>

int main()
{
    int a = 10;
    int b = 20;
    float c = 45.0f;
    float d = 40.0f;
    printf("a = %d, b = %d , c = %f , d = %f \n",a,b,c,d);
    return 0;
}

输出结果为

a = 10, b = 20 , c = 45.000000 , d = 40.000000

其中%d就是int类型的转换符,%f是float类型的转换符

注意!!!

如果要在格式串中插入转换符来显示格式串和表达式拼接的效果,必须要保证转换符与表达式的一一对应。

如:

1.在打印int型变量使用了%f,就会打印出一个无意义的数,其他类型也是如此。

2.在格式串中加入了3个转换符,但后边的表达式只有1个,那么只有第1个转换符会被转换为有效值,而第2、3个会变为无效值。

3.在格式串中加入了1个转换符,但后面的表达式却又是3个,那么只会将表达式1的值替换到转换符上。

总结:使用printf()格式化输入时,要么只输出格式串,要么就要保证表达式列表如转换符一一对应。

转换符的最小栏宽和精度

%m.pX

%X:共同组成一个简单的转换符,如int的转换符%d,float的转换符%f

m:m就是最小栏宽(minimum field width)最小栏宽就是为表达式转化为转换符时能显示的最小字符数

比如,当前我们要显示int型123

我们使用%5d时,他会将123输出为

  123

也就是说会将数字右对齐后,用空格补齐左边的空位以达到m长度,当然,如果int数字的长度小于m,则只显示123,不会截断数字

如我们使用%1d输出int型123,得到的结果会是

123

如果这个类型是float,那会优先为float补齐6个小数位,没有数字会优先补0

如果m为负数,会变为左对齐,向右边补空格

如下,我们在转换符后面紧贴字母方便观察

#include <stdio.h>

int main()
{
    int a = 123;

    printf("a = %-5daaa  \n",a);
    return 0;
}

输出

a = 123  aaa

可以看出,明显多了两个空位 

.p:精度(precision)  .和p共同组成精度

精度这个具体还要根据转换符类型区分

int型使用精度:当前转换符是%d(10进制整数),那么就相当于栏宽的作用,区别是栏宽补齐的是空格,而精度补齐的是0;

如果用%.5d输出int值123的出的会是

00123

同理,如果精度小于10进制数字长度,也只会显示数字本身

float型使用精度:当前转换符时%f(浮点型数)

会显示小数点后面p位,打印浮点型数,如果不写精度,默认显示6位。

转义序列(escape sequence)

\+任意字母或者符号

常见的如

 \n:换行

\t:水平制表符

实际开发中不建议直接使用printf()输出log,会显得log信息很混乱,尽量封装成一个函数,便于log的筛选和模块信息区分,并且非测试阶段不要大量使用log,会影响系统性能,建议同时采用宏开关,在产品上线后关闭不必要的log,实现灵活打印。

printf常见的坑

1.printf()是一个非常消耗性能的log输出函数,当我们某一个函数对性能要求非常高时,或存在大量的循环调用、递归,这种情况下printf的耗时将会变得非常可观,所以当我们如果想测试一个函数的性能时,千万不要在函数内部进行printf()输出,printf()的高耗时会导致你测出的时间要长很多,会误导你认为自己的方案不行,其实有可能你的方案本身已经足够优秀了

正确的做法是应该在函数进入前记录系统毫秒值,出函数时记录系统毫秒值,计算进出函数的时间差来计算算法的实际耗时

如在Windows系统下:

#include <windows.h>
#include <stdio.h>

int main() {
    int timerStart, timerStop;
    timerStart = GetTickCount();
    //耗时操作
    timerStop = GetTickCount();
    printf("times == %d ms\n", timerStop - timerStart);
    return 0;
}

2.printf用在C++使用上打印值并不好用,因为C++可以向下兼容C,但C无法向上兼容C++,如果想在C++中使用printf(),还是要注意的,我的建议是,C++中 就不要输出printf(),直接使用 cout

#include <iostream>
#include <bitset>

using namespace std;

static bitset<sizeof(int)*8> a;

int main()
{
    a[0] = 1;
    cout<<"cout a1 == "<<a[0]<<endl;
    printf("printf a1 == %d \n",a[0]);
    return 0;
}

输出为

cout a1 == 1

printf a1 == 6422152

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值