c语言中百分号4d,printf, sprintf,输出数据类型(转)

本文详细解析C/C++中的printf函数,包括整数(d,i,o,x,X)、浮点数(e,E,f,g,G)、字符串(s)的转换说明,以及域宽、精度和输出控制的使用。通过实例演示展示了如何精确控制输出格式和整数的正负显示。
摘要由CSDN通过智能技术生成

字符的参数类型 ;输出形式

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型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值