printf, sprintf,输出数据类型

转自:http://blog.csdn.net/willy3000/article/details/5786888


字符的参数类型 ;输出形式
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("%4d/n",123)
printf("%4d/n",1234)
printf("%4d/n",12345)
则输出结果为:
123
1234
12345

    用printf函数也可以指定输出数据的精度。对於不同的数据类型,精度有不同的含意。
    用于整数转换说明符,精度表示至少要输出的数字个数(如果被输出的数字个数小於只指定的精度,就在输出值前面加0)。
printf("%.4d/n",873)
printf("%.9d/n",873)
则输出结果为:
0873
000000873

sprintf(s, "%08X", 4567); 和sprintf(s, "%.8X", 4567); 这两种写法是一样的。
printf( "%.8X", 4567);和printf( "%08X", 4567);这两种写法也是一样的
。%08X 和 %.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:
   :%10s:        :hello, world:
   :%.10s:       :hello, wor:
   :%-10s:       :hello, world:
   :%.15s:       :hello, world:
   :%-15s:       :hello, world   :
   :%15.10s:     :     hello, wor:
   :%-15.10s:    :hello, wor     :
-(减号): 使输出在域宽中左对齐。

例1. 输出整数
#include <stdio.h>
main( )
    {
     printf("%d/n",455);
     printf("%i/n",455);
     /*在printf中,i和d是等价的*/
     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 <stdio.h>

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 <stdio.h>
main( )
    {
     printf("%4d/n",1);
     printf("%4d/n",12);
     printf("%4d/n",123);
     printf("%4d/n",1234);
     printf("%4d/n/n",12345);
     printf("%4d/n",-1);
     printf("%4d/n",-12);
     printf("%4d/n",-123);
     printf("%4d/n",-1234);
     printf("%4d/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("%5d",5)
printf("%*d",9,3) 等于 printf("%9d",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, "%8d%8d", 123, 4567); 产生:" 123 4567" 可以指定宽度,不足的左边补空格。
sprintf(s, "%-8d%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, "%08X", 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型。


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值