printf、sprintf、snprintf、fprintf 超、凢脫俗 2022-01-11 06:37 372阅读 0赞 原文网址:[printf、sprintf、snprintf、fprintf\_IT利刃出鞘的博客-CSDN博客][printf_sprintf_snprintf_fprintf_IT_-CSDN] # 简介 # xxxprintf函数都是处理字符串的,也就是说,参数必须以'\\0'结尾。操作结束后,写入到的文件/buffer都会自动添加上'\\0'。 # printf # 主要功能:打印字符串 函数原型:int printf(const char \*format, ...); format的格式:% \[flags\] \[width\] \[.prec\] \[F|N|h|l\] type ## type ## <table> <tbody> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>type</strong></span></p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;"><strong>对应数据类型</strong></p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;"><strong>含义</strong></p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">d/i</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">有符号的10进制整数,i是老式写法。(正数不输出符号)</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">ld</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">long</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">有符号10进制长整形</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">u</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">无符号10进制整数</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">lu</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">long unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">无符号10进制长整型或unsignedlong</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">llu</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">long long unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">64位的无符号10进制长长整型。若系统是32位,则用此会出错。</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">o</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">无符号8进制整数(不输出前缀o)</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">x/X</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">无符号16进制整数,x对应的是abcdef,</p> <p style="margin-left:0pt;">//X对应的是ABCDEF(不输出前缀0x)</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">lx</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">long unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">无符号16进制长整型</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">llx</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">long long unsigned int</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">64位的无符号16进制长长整型。若系统是32位,则用此会出错。</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">f(lf)</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">float(double)</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">单精度浮点数用f,双精度浮点数用lf(尤其scanf不能混用)</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">e/E</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">double</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">科学计数法表示的数,"e"的大小写代表在输出时用的“e”的大小写</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">g/G</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">double</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">以%f或%e/%E中较短的输出宽度输出,且不输出无意义的0.</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">c</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">char</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">字符型。可以把输入的数字按誄II码相应转换为对应的字符</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">s/S</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">char*/wchar_t*</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">字符串。输出字符串中的字符直至字符串中的空字符</p> <p style="margin-left:0pt;">//(字符串以'\0‘结尾,这个'\0'即空字符)</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">p</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">void*</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">以16进制形式输出指针</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">n</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">int*</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">到此字符之前为止,一共输出的字符个数,不输出文本</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">%</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">无输入</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">不进行转换,输出字符‘%’(百分号)本身</p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">m</p> </td> <td style="vertical-align:top;width:121.75pt;"> <p style="margin-left:0pt;">无</p> </td> <td style="vertical-align:top;width:361.6pt;"> <p style="margin-left:0pt;">打印errno值对应的出错内容,(例:printf("%m\n");)</p> </td> </tr> </tbody> </table> ## flags ## <table> <tbody> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;"><span style="color:#f33b45;"><strong>flag</strong></span></p> </td> <td style="vertical-align:top;width:119.45pt;"> <p style="margin-left:0pt;"><strong><span style="color:#333333;">字符名称</span></strong></p> </td> <td style="vertical-align:top;width:363.9pt;"> <p style="margin-left:0pt;"><strong><span style="color:#333333;">说明</span></strong></p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">-</p> </td> <td style="vertical-align:top;width:119.45pt;"> <p style="margin-left:0pt;">减号 </p> </td> <td style="vertical-align:top;width:363.9pt;"> <p style="margin-left:0pt;">左对齐,右边填充空格(默认右对齐)。 例:%-7d 表示输出7位整数左对齐,右边补空格 </p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">+</p> </td> <td style="vertical-align:top;width:119.45pt;"> <p style="margin-left:0pt;">加号 </p> </td> <td style="vertical-align:top;width:363.9pt;"> <p style="margin-left:0pt;">在数字前增加符号 + 或 - </p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">0</p> <p style="margin-left:0pt;"></p> </td> <td style="vertical-align:top;width:119.45pt;"> <p style="margin-left:0pt;">数字零</p> <p style="margin-left:0pt;"> </p> </td> <td style="vertical-align:top;width:363.9pt;"> <p style="margin-left:0pt;">输出的前面补上0,直到占满指定列宽为止(不可以搭配使用“-”) </p> <p style="margin-left:0pt;">例:printf("%02d", i) </p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;"></p> </td> <td style="vertical-align:top;width:119.45pt;"> <p style="margin-left:0pt;">空格</p> </td> <td style="vertical-align:top;width:363.9pt;"> <p style="margin-left:0pt;">输出值为正时加上空格,为负时加上负号 </p> </td> </tr> <tr> <td style="vertical-align:top;width:50.75pt;"> <p style="margin-left:0pt;">#</p> </td> <td style="vertical-align:top;width:119.45pt;"> <p style="margin-left:0pt;">井号 </p> </td> <td style="vertical-align:top;width:363.9pt;"> <p style="margin-left:0pt;">type 结果</p> <p style="margin-left:0pt;">c、s、d、u: 无影响;<br> o: 在输出时加前缀o;<br> x: 在输出时加前缀0x;</p> <p style="margin-left:0pt;">X: 在输出时加前缀0X;<br> e、g、f: 当结果有小数时才给出小数点。</p> <p style="margin-left:0pt;"></p> <p style="margin-left:0pt;">例:printf("%#x", i) </p> </td> </tr> </tbody> </table> ## **width** ## 用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(通过flags控制)。 ## **prec** ## 精度格式符以“.”开头,后跟十进制整数。如果没有给出精度,按 0(零)对待。 如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。 prec没指定时:d,i,o,u,x时:没有影响;e,E,f时:不显示小数点 d、o、i、 u、x 或 X : 转换的最少数字显示位数。 e、E或 f : 转换的基数字符后的最少数字显示位数。对于f,是小数位数。 g : 转换的最大有效数字位数。 s : 转换中字符串的最大打印字节数目。 ## %\*.\* ## **“\*”\*在“.”以前:对于输入** 输入时:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值 scanf("%\*d %\*d %d", &n); 如果输入2004 2005 2006 那么n=2006 **对于输出** **“\*”\*在“.”之前**:用户输入一个位宽值来代替,表示输出的字符所占位宽。 **“\*”\*在“.”之后**:表示输出位数,具体的数据来自参数表。printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量, 如果没有.,则默认\*在.之后。 例1 printf("%\*s",5,"123"); 输出结果:\#\#123 (\#代表一个空格) 相当于5代替了\* 例2 char \*s = "this is test example"; int a = 15, b = 10; printf("%\*.\*s\\n", a, b, s); 输出结果:\#\#\#\#\#this is te (\#代表一个空格) **F|N|h|l** 表示指针是否是远指针或整数是否是长整数 F 远指针 N 近指针 h 短整数(short int) l 长整数(long int) (此处如果与d搭配为%lld则为long long int(C99),与f搭配为%llf则为long double(C99)) \[Argument\] 包含需要输出的数据,可以是常量(字符常量、数字常量、字符串常量),变量,以及运算式。此处的数据应当与前面的format中的格式控制符一一对应(如果不对应会产生错误)。 # printf技巧 # ## \\b ## printf的\\b可以将光标回退一个字节。(backspace) **例1** printf("1234"); printf("\\b56"); 输出的结果为:12356 (5将4覆盖) **例2** 在同一位置打印数字方法 int i = 0; printf("%02u%%", i); for(i = 0; i < 100; i++)\{ printf( "\\b\\b\\b" " " "\\b\\b\\b" "%02u%%", i); \} ## 不能立即输出 ## **有时print不能立即输出原因** unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。 ANSI C中定义换行符'\\n'可以认为是行刷新标志。所以,printf函数没有带'\\n'是不会自动刷新输出流,直至缓存被填满。 **解决方法** 1、在printf里加"\\n" 2、fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上 。 3、setvbuf(stdout,NULL,\_IONBF,0); //如果你嫌上个方法麻烦, 就使用这个函数. 直接将缓冲区禁止了. 它就直接输出了 ## 百分数进度 ## static void print\_process\_start(float val) \{ float tmp = 0.0; tmp = val \* 100; printf("%05.2f%%", tmp ); \} static void print\_process(float val) \{ float tmp = 0.0; tmp = val \* 100; printf( "\\b\\b\\b\\b\\b\\b" " " "\\b\\b\\b\\b\\b\\b" "%05.2f%%", tmp); \} 打印结果: 00.00% => 12.34% => ... ## unsigned long long ## int main() \{ unsigned long long ull = 0x123456789; unsigned int tmp; printf("\#x : %\#x\\n", ull); printf("\#llx : %\#llx\\n", ull); tmp = (unsigned int)(ull >> 32); printf("H : %\#x\\n", tmp); tmp = (unsigned int)(ull & 0xffffffff); printf("L : %\#x\\n", tmp); printf("(unsigned int)(ull >> 32) : %\#x\\n", (unsigned int)(ull >> 32)); printf("(unsigned int)(ull & 0xffffffff) : %\#x\\n", (unsigned int)(ull & 0xffffffff)); printf("(unsigned int)(ull << 32) : %\#x\\n", (unsigned int)(ull << 32)); return 0; \} 用gcc -m32 -o test test.c和gcc -o test test.c编译后,执行./test,结果是: \#x : 0x23456789 \#llx : 0x123456789 H : 0x1 L : 0x23456789 (unsigned int)(ull >> 32) : 0x1 (unsigned int)(ull & 0xffffffff) : 0x23456789 (unsigned int)(ull << 32) : 0 # sprintf # 其他网址:[sprintf的使用 - CSDN博客][sprintf_ - CSDN] **主要功能**:把格式化的数据写入某个字符串中 **函数原型**:int sprintf(char \*str, const char \*format, ...); str: 将要写入的字符串指针 format:格式化字符串 ... :可选参数,可以是任意类型的数据。对应format里边 **返回值**: 成功:返回写入buffer 的字符数,结束字符‘\\0’不计入内 出错:返回-1. 如果 buffer 或 format 是空指针,函数将返回-1,并且 errno 会被设置为 EINVAL。 **示例**: char buf\[10\]; char \*str = "hello"; int a = 10 sprintf(buf, "%s%d", str, a) 则buf内容为:"hello10" # snprintf # **主要功能**:把格式化的数据写入某个字符串中 **函数原型**:int snprintf(char \*str, size\_t size,const char \*format, ...); str: 将要写入的字符串指针 size: format:格式化字符串 ... :可选参数,可以是任意类型的数据。对应format里边 **返回值**: 成功:返回想要写入的字符串长度 出错:返回负值。 (1) 若格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\\0'); (2) 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串 结束符('\\0'),返回值为欲写入的字符串长度。 # fprintf # **主要功能**:格式化输出到一个流/文件中 **函数原型**:int fprintf(FILE \*stream, const char \*format, ...); stream:文件指针 (stdin,stdout,stderr为标准输入、输出、错误,可以直接使用)。或者 stream = fopen("test.txt","r+"); format:格式化字符串 ... :可选参数,可以是任意类型的数据。对应format里边 **返回值**: 成功:输出的字符数 失败:负值 [printf_sprintf_snprintf_fprintf_IT_-CSDN]: https://knife.blog.csdn.net/article/details/92844106 [sprintf_ - CSDN]: https://blog.csdn.net/nopoppy/article/details/52589745
还没有评论,来说两句吧...