字符的参数类型 ;输出形式
d,i int类型;显示一个带符号的十进制数(i和d用在scanf函数中时是不同的)。
o int类型;无符号八进制数(没有前导0)
x,X int类型;显示一个无符号的十六进制数,X可用来显示数字0~9和字母A~F,x可用来显示数字0~9和字母a~f 。
u int类型;无符号十进制数
c int类型;单个字符
s char *类型;顺序打印字符串中的字符,直到遇到'/0'或已打印了由精度指定的字符数为止。
f double类型;十进制小数[-]m.dddddd,其中d的个数由精度指定(默认值为6)
e,E double类型;[-]m.dddddde+/-xx或[-]m.ddddddE+/-xx,其中d的个数由精度指定(默认值为6)
g,G double类型;如果指数小于-4或大于等于精度,则用%e或%E格式输出,否则用%f格式输出。尾部的0和小数点不打印。
p void *类型;指针(取决于具体实现)
% 不转换参数;打印一个百分号% 字母h或l,字母h表示将整数作为short类型打印,字母l表示将整数作为long类型打印。
用于存放输出数据的宽度称为“域宽”。如果域宽大于被打印数据的宽度,数据通常会在域内右对齐。如果输出值的宽度大于域宽时,域宽是自动增长的。域宽通常插在百分号和转换说明符之间。
printf("M/n",123)
printf("M/n",1234)
printf("M/n",12345)
则输出结果为:
123
1234
12345
用printf函数也可以指定输出数据的精度。对於不同的数据类型,精度有不同的含意。
用于整数转换说明符,精度表示至少要输出的数字个数(如果被输出的数字个数小於只指定的精度,就在输出值前面加0)。
printf("%.4d/n",873)
printf("%.9d/n",873)
则输出结果为:
0873
000000873
sprintf(s, "X", 4567); 和sprintf(s,
"%.8X", 4567); 这两种写法是一样的。
printf( "%.8X", 4567);和printf( "X", 4567);这两种写法也是一样的
。X 和 %.8X
都表示将对应变量转换为16进制无符号数之后如果目标数字不满8位,则在其左侧补0以填满8位,然后输出。
用于浮点数转换说明符e、E、f,精度是小数点后面显示的数字个数。
printf("%.3f/n",123.45678)
printf("%.3e/n",123.45678)
则输出结果为:
123.456
1.235e+02
用于浮点数转换说明符g、G,精度是打印出的有效数字的最大个数。
printf("%.3g/n",123.45678)
则输出结果为:
123
用于字符串说明符s时,精度是被输出的字符的最大个数。
printf("%.11s/n","Happy birthday")
则输出结果为:
Happy birth
例如:
打印字符串“hello,
world”(12个字符,此处未包含/0)时根据不同的转换说明产生的不同结果。我们在每个字段的左边和右边加上冒号,这样可以清晰地表示出字段的宽度。
:%s: :hello, world:
:s: :hello, world:
:%.10s: :hello, wor:
:%-10s: :hello, world:
:%.15s: :hello, world:
:%-15s: :hello, world :
:.10s: : hello, wor:
:%-15.10s: :hello,
wor :
-(减号): 使输出在域宽中左对齐。
例1. 输出整数
#include
main( )
{
printf("%d/n",455);
printf("%i/n",455);
printf("%d/n",+455);
printf("%hd/n",32000);
printf("%ld/n",2000000000);
printf("%o/n",455);
printf("%u/n",455);
printf("%u/n",-455);
printf("%x/n",455);
printf("%X/n",455);
return 0;
}
上面的程序输出以下的结果
455
455
455
32000
2000000000
707
455
4294966841
1c7
1C7
printf("%u/n",-455);输出的是4294966841
-1 原码1000000000000001
-1补码 1111111111111111
-1变成无符号数是65535
-455变成无符号数输出65081,按长整型输出4294966841.
长整型-455的源码是
10000000 00000000 00000100 01010101
补码是
11111111 11111111 11111011 10101011
变成无符号数是2~31+2~30+2~29..........
同理:
unsigned short si = -1;
这句话 在赋值的时候发生隐式类型的转换。
如果没有截断、提升,那么 si 内存中的二进制内容和 -1 一样,但是会按照 unsigned short类型来 解释。这和
unsigned short si = 'a' 是一个道理。
因此只要你写下 -1 那么它就是个 signed,至于你赋值给 unsigned 或者 double,都不改变 -1 是 signed
这个事实。
但是编译器可能会发出警告。 可以用如下这种的方法来强行赋值:
unsigned short si = (unsigned short) -1;
结果为 si = 0xFFFF (65535)
printf("%d/n",+455);输出的是455
%d是有符号整型,但是输出时不输出正号,负数却输出负号。如果你想输出正号,那就在%e前面加一个正号,然后可以在前面加个条件判断。
例2. 输出浮点数
#include
main( )
{
printf("%e/n",1234567.89);
printf("%e/n",+1234567.89);
printf("%e/n",-1234567.89);
printf("%E/n",1234567.89);
printf("%f/n",1234567.89);
printf("%g/n",1234567.89);
printf("%G/n",1234567.89);
return 0;
}
上面的程序输出以下的结果
1.234568e+06
1.234568e+06
-1.234568e+06
1.234568E+06
1234567.890000
1.234567e+06
1.234567E+06
默认情况下,用转换说明符e、E、和f打印出的值带6个小数位。
例3. 输出域宽
#include
main( )
{
printf("M/n",1);
printf("M/n",12);
printf("M/n",123);
printf("M/n",1234);
printf("M/n/n",12345);
printf("M/n",-1);
printf("M/n",-12);
printf("M/n",-123);
printf("M/n",-1234);
printf("M/n",-12345);
return 0;
}
上面的程序输出以下的结果
1
12
123
1234
12345
-1
-12
-123
-1234
-12345
还可以用如下方法表示:
(例) printf("%*.*s/n",m,n,ch);
前边的*定义的是总的宽度,后边的定义的是输出的个数。分别对应外面的参数m和n。这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式。
例如
printf("%*d",5,5) 等于 printf("]",5)
printf("%*d",9,3) 等于 printf("�",3)
函数sprintf执行的转换和函数printf相同,但它将输出保存到—个字符串中。
int sprintf(char *string, char *format, arg1, arg2, ...);
sprintf函数和printf函数一样,按照format格式格式化参数序列arg1、arg2、…,但它将输出结果存放到string中,而不是输出到标准输出中。当然,string必须足够大以存放输出结果。
1234/100如果变量是用int定义的,那就是12啊,因为是整型的,只保留整数部分
如果用float定义就可以得到小数部分了。
printf是标准输出流的输出函数,用来向标准输出设备输出;
fprintf则是向文件输出,将输出的内容输出到硬盘上的文件中 。
fprintf(fp,"%s",name); fp为文件指针。
fprintf(stdout,"%s",name); 和 printf("%s",name);
是完全一样的(前提是你的标准输出是指向显
示器,不过一般标准输出都是显示器)。
sprintf可以把整数打印到字符串中,在大多数场合中sprintf可以替代itoa。
例如:
sprintf(s, "%d", 123); 把整数123 打印成一个字符串保存在s中。
sprintf(s, "��", 123, 4567); 产生:" 123 4567" 可以指定宽度,不足的左边补空格。
sprintf(s, "%-8d�", 123, 4567); 产生:"123 4567" 其中123左对齐。
例如:
也可以按照16 进制打印如下。
sprintf(s, "%8x", 4567); 小写16
进制,宽度占8 个位置,右对齐。
sprintf(s, "%-8X", 4568); 大写16 进制,宽度占8 个位置,左对齐。
这样,一个整数的16 进制字符串就很容易得到。
在打印16 进制内容时想要得到左边补0 的等宽格式,那在表示宽度的数字前面加个0 就可以了。
例如:
sprintf(s, "X", 4567); 产生:"000011D7"
以“%d”进行的十进制打印同样可以使用这种左边补0 的方式来得到等宽格式。
sprintf(buff,"%s",name); buff为字符数组。将name输入到名为buff指向的字符串中。
sprintf能把一个int型按逐个字符转换成char型。
例如:
int a = 12345;
char s[10] = "";
sprintf(s,"%d",a);
可得 s[0]=1; s[1]=2; s[2]=3; s[3]=4; s[4]=5; 及转换成了char型。