关于这部分的内容,自己每次用的时候都是去翻书,或者上网查,但是一直没有发现一篇文章很系统的介绍这一部分的内容,直到读完了《C陷阱与缺陷》,在附录中总结了格式化输入输出的符号,及其修饰符,今天暂且根据该书整理了简单格式类型部分,后续的修饰符会另写总结,本文旨在便于笔者查阅和方便各位博友。
[color=green]简单格式类型[/color]:
[color=darkred]格式字符串中的每个格式项都是由一个%符号打头,后面接一个称为格式码的字符,格式码指明了格式转换的类型。[/color]
[color=green]首先最常用的就是%d[/color], 以10进制打印一个整数。例如:
将打印出
[color=green]%u格式项与%d类似[/color],不同之处是%u打印无符号10进制整数。例如:
将打印出4294967259.
[color=green]%o, %x, %X[/color]用于打印8进制或者16进制的整数。
%x, 用小写字母a, b, c, d, e, f来表示10到15的数位值
%X, 用大写字母A, B, C, D, E, F来表示10到15的数位值。
例如:
将打印出:
[color=green]%s[/color]
用于打印一个字符串:与之对应的参数应该是一个字符指针,指向待输出的字符串首字符的地址,知道遇见一个空字符’\0’才终止。%s格式项所对应输出的字符串必须以一个空字符’\0’作为结束标志。 因为printf函数要一次来定位一个字符串何时结束。如果与%s对应的字符串并不是以空字符’\0’作为结束标志,那么printf函数将不断打印出其后面的字符,直到在内存中某处找到一个空字符’\0’为止。这时输出就可能相当的长。
例如:
如果n为37,输出将是:
如果n为1, 输出将是
注:
与
两者含义并不相同,前者把字符串s中的任何%字符视为一个格式项的标志,其后的字符会被视为格式码,如果除%%之外的任何格式码在字符串中出现,而后面有没有对应的参数,将会带来麻烦。而后者将会打印出任何一空字符结尾的字符串。
NULL指针并不指向任何实际的内存位置,因此肯定也不可能指向一个字符串。因此,
Printf(“%s \n”, NULL);
的结果将难以预料。
[color=green]%c
[/color]用于打印单个字符:
等效于
Putchar(c);
但是前者的适应性和灵活性更好,能够把字符c的值嵌入某个更大的上下文中。与%c格式项对应的参数是一个为了打印输出而被转换为字符型的整型值。例如:
将打印出:
[color=green]%g, %e, %f[/color]这3个格式项用于打印浮点值。
%g
去掉数字尾缀的0,保留6位有效数字。因此,
将打印出
1 0.5 0.333333 0.666667(四舍五入) 0.25 0
如果一个数的绝对值大于999999, 按%g的格式打印这个字符,会采用科学计数法来打印,例如:
将打印出:
1.23457e+08
对于很小的数值,除非该数的指数小于或等于-5, %g格式项才会采用科学计数法表示。因此:
将打印出:
0.00314159 0.000314159 3.14159e-05
%e和%f格式则在用于打印浮点数是,分别要求一律显式地使用指数形式和禁止使用指数来表示浮点数。例如:
将打印出:
注:
%e和%f对有效数字的保留是小数点后6位有效数字,跟%g的总共6位有效数字不同。
[color=green]%E和%G[/color]格式项跟对应的%e和%g在行为上基本相同,但是科学计数法的e改用E。
[color=green]%%[/color]格式用于打印一个%符号。
如有错误,请留言指正,谢谢。
文章转载自:[url]http://blog.sina.com.cn/s/blog_4a339b640100s4hz.html[/url]
[color=green]简单格式类型[/color]:
[color=darkred]格式字符串中的每个格式项都是由一个%符号打头,后面接一个称为格式码的字符,格式码指明了格式转换的类型。[/color]
[color=green]首先最常用的就是%d[/color], 以10进制打印一个整数。例如:
Printf(“2 + 2 = %d\n”, 2 + 2);
将打印出
2 + 2 = 4.
[color=green]%u格式项与%d类似[/color],不同之处是%u打印无符号10进制整数。例如:
Printf(“%u\n”,-37);
将打印出4294967259.
[color=green]%o, %x, %X[/color]用于打印8进制或者16进制的整数。
%x, 用小写字母a, b, c, d, e, f来表示10到15的数位值
%X, 用大写字母A, B, C, D, E, F来表示10到15的数位值。
例如:
int n = 108;
printf( “%d decimal = %o octal = %x hex = %X HEX \n”, n, n, n, n);
将打印出:
108 decimal = 154 octal = 6c hex = 6C HEX
[color=green]%s[/color]
用于打印一个字符串:与之对应的参数应该是一个字符指针,指向待输出的字符串首字符的地址,知道遇见一个空字符’\0’才终止。%s格式项所对应输出的字符串必须以一个空字符’\0’作为结束标志。 因为printf函数要一次来定位一个字符串何时结束。如果与%s对应的字符串并不是以空字符’\0’作为结束标志,那么printf函数将不断打印出其后面的字符,直到在内存中某处找到一个空字符’\0’为止。这时输出就可能相当的长。
例如:
Printf (“There %s %d item%s in the list. \n”, n!=1? “are”: “is”, n, n!=1? “s”: “”);
如果n为37,输出将是:
There are 37 items in the list.
如果n为1, 输出将是
There is 1 item in the list.
注:
Printf(s);
与
Printf(”%s”, s);
两者含义并不相同,前者把字符串s中的任何%字符视为一个格式项的标志,其后的字符会被视为格式码,如果除%%之外的任何格式码在字符串中出现,而后面有没有对应的参数,将会带来麻烦。而后者将会打印出任何一空字符结尾的字符串。
NULL指针并不指向任何实际的内存位置,因此肯定也不可能指向一个字符串。因此,
Printf(“%s \n”, NULL);
的结果将难以预料。
[color=green]%c
[/color]用于打印单个字符:
Printf(“%c”, c);
等效于
Putchar(c);
但是前者的适应性和灵活性更好,能够把字符c的值嵌入某个更大的上下文中。与%c格式项对应的参数是一个为了打印输出而被转换为字符型的整型值。例如:
Printf( “The decimal equivalent of ‘%c’ is %d \n”, ‘*’, ‘*’);
将打印出:
The decimal equivalent of ‘*’ is 42.
[color=green]%g, %e, %f[/color]这3个格式项用于打印浮点值。
%g
去掉数字尾缀的0,保留6位有效数字。因此,
Printf(“%g %g %g %g %g %g\n”, 1/1.0, 1/2.0, 1/3.0, 2/3.0, 1/4.0, 0.0);
将打印出
1 0.5 0.333333 0.666667(四舍五入) 0.25 0
如果一个数的绝对值大于999999, 按%g的格式打印这个字符,会采用科学计数法来打印,例如:
Printf(“%g\n”, 123456789.0);
将打印出:
1.23457e+08
对于很小的数值,除非该数的指数小于或等于-5, %g格式项才会采用科学计数法表示。因此:
Printf(“%g %g %g\n”, 3.14159e-3, 3.14159e-4, 3.14159e-5);
将打印出:
0.00314159 0.000314159 3.14159e-05
%e和%f格式则在用于打印浮点数是,分别要求一律显式地使用指数形式和禁止使用指数来表示浮点数。例如:
Printf( “%e %f”, 123456789, 123456789)
将打印出:
1.234567e+08 123456789.000000
注:
%e和%f对有效数字的保留是小数点后6位有效数字,跟%g的总共6位有效数字不同。
[color=green]%E和%G[/color]格式项跟对应的%e和%g在行为上基本相同,但是科学计数法的e改用E。
[color=green]%%[/color]格式用于打印一个%符号。
如有错误,请留言指正,谢谢。
文章转载自:[url]http://blog.sina.com.cn/s/blog_4a339b640100s4hz.html[/url]