printf 函数

Posted kylinhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了printf 函数相关的知识,希望对你有一定的参考价值。

上一篇以 hello world 程序开始,hello world 程序核心主体只有一句话:

printf("Hello world!");

如果需要输出一些变量,可以使用 "%d", "%s", "%c" 等,传入对应变量输出。

int main()

    int i = 10;
    char *s = "Kylin";
    char c =u;
    printf("Hello world, %d, %s, %c\\n!", i, s, c);
    return 0;

我们来看一下printf 原型

_Check_return_opt_ _CRTIMP int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...);
extern int printf (const char *__restrict __format, ...);

以上为 windows (VS2012) 和 Linux 中的不同原型声明,忽略VS中 _Check_return_opt_, __cdecl 等,两个形式是一样的,第一个参数都是 const char* 类型,后续参数为”...”。

VS的声明中, __cdecl 涉及到C 和 C++ 中的函数调用方式 (cd call, std call 等),我们后续会详细分析。

printf函数的可变参数

像 printf 函数,我们不知道调用者会传入多少需要输出的变量,最初的函数设计者能想到两种方案:

  1. 固定最大支持的参数数目(如 256),为每个可能定义不同的函数:这样 stdio.h 中会有256个支持 print 的函数, print0, print1.....print255 (这时候还没有C++,没有同名函数重载的概念)
  2. 定义一个函数,让它支持可变参数

传说计算机是为懒人发明的,类似print 的这种函数还会有很多,我们一定会选择第二种方案。

C语言为我们提供了 va_list 来支持可变参数。

下边会给出一个伪代码实现 printf 函数中,处理可变参数部分

va_list arg;
va_start(arg,str);
/*
对可变参数做处理,
在printf 中,主要是处理"%d, %f "等
*/
switch(c)
    case: s:
    poutstr = va_arg(arg,char*);
    break;
..........

va_end(arg);

printf 函数的可变参数解决了,下一步需要处理的是 printf 中的格式化信息。

printf 用法

除了本身需要打印出来的字符串,输出的变量的方式为

"%[FLAG][WIDTH][.PRECISION]type"

除了type, 其余使用 [] 的为可选参数.

我们先看一下 type 参数的列表

type参数

 技术图片

上图为复制他人博客中的表格

FLAG 参数

 "-"     结果左对齐,右边填空格。默认是右对齐,左边填空格。

"+"     输出符号

" "      输出值为正时加上空格,为负时加上负号

"#"      type是o、x、X时,增加前缀0、0x、0X.    type是a、A、e、E、f、g、G时,一定使用小数点。默认的,如果使用.0控制不输出小数部分,则不输出小数点。type是g、G时,尾部的0保留

"0"      将输出的前面补上0,直到占满指定列宽为止

WIDTH 参数

示例:

printf("%07d",1000);输出:0001000

printf("%0*d",7,1000);输出:0001000

PRECISION 参数

 一般用于输出 float 类型时,显示指定保留的精度。

 

本文简单介绍了 C 语言的 printf 函数。printf 中还包含一个函数调用方式会在后续的文章中说明。

以上是关于printf 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何理解printf变参函数的实现

quick lua 能用printf函数打印吗

printf的问题

c语言中,puts和printf函数有啥区别?

C语言printf函数详解和示例

printf & scanf函数