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,%cn!",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 函数,我们不知道调用者会传入多少需要输出的变量,最初的函数设计者能想到两种方案:
传说计算机是为懒人发明的,类似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 参数示例:
PRECISION 参数?一般用于输出 float 类型时,显示指定保留的精度。 ? 本文简单介绍了 C 语言的 printf 函数。printf 中还包含一个函数调用方式会在后续的文章中说明。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |