[c/c++]格式输入输出----printf & scanf

1.printf

(1)转换说明符

转换说明符号输出
%a浮点数、十六进制数和p计数法
%A浮点数、十六进制数和p计数法
%c单个字符
%d有符号十进制整数
%e浮点数,e计数法(小写e)
%E浮点数,e计数法(大写E)
%f浮点数,十进制
%g自动选择%f,%e。%e用于指数小于-4或者大于或等于精度时
%G自动选择%f,%E。%E用于指数小于-4或者大于或等于精度时
%i有符号十进制整数(%d相同)
%o无符号8进制数(不显示前缀0)
%p指针
%s字符串
%u无符号十进制整数
%x无符号十六进制整数(字母小写)(不显示前缀0x)
%X无符号十六进制整数(字母大写)(不显示前缀0x)
%%打印一个%符号

(2)转换说明符修饰符

在%和转换字符之间可以插入修饰字符

修饰符含义
标记五种标记(+,-,空格,#和0),可以使用一个或者多个
数字

最小字段宽度

如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段

如"%4d"

 

.数字

精度

对于%e,%E和%f,表示小数点右边数字的位数

对于%g和%G的转换,表示有效数字的最大位数

对于%s转换,表示待打印字符的最大位置

对于整型转换,表示待打印数字的最小位数

如果有必要使用前导0达到位数

只使用 .  时,表示后面紧跟一个0,即%.f和%.0f等价

h

和整型转换说明一起使用,表示short int或unsigned short int类型的值

"%hu","%hx","%6.4hd"

hh

和整型类型一起使用,表示signed char或unsigned char

"%hhu","%hhx","%6.4hhd"

j

和整型一起使用,表示intmax_t或uintmax_t类型的值(定义在stdint.h中)

"%jd","%8jx"

l

和整型转换说明一起使用,表示long int或unsigned long int

"%ld","%8lu"

ll

和整型一起使用,表示long long int或unsigned long long int 类型的值

"%lld","%8llu"

L

和浮点转换说明一起使用,表示long double

"%Ld","%10.4Le"

t

和整型一起使用,表示ptrdiff_t类型的值,ptrdiff_t是两个指针变量的差值的类型

"%td","%12ti"

z

和整型转换说明一起使用。表示size_t类型的值。size_t是sizeof返回值的类型

"%zd","%12zd"

(3)转换说明符修饰符中的标记

标记含义
-

待打印项左对齐,即从字段的的左侧开始打印该项

"%-20s"

+

有符号值若为正,则在之前加上正号。若为负,加上减号

"%+6.2f"

空格

有符号值为正,值前加上空格,为负加上减号

"% 6.2f"

#

%o以0为开始显示,%x和%X以0x或0X为开头显示,%g和%G保证了后面的0不被删除

"%#o","%#8.0f","%+#10.3e"

0对于数值格式,使用前导0代替空格,

(4)打印较长的字符串

允许一条语句分成多行。

printf("xxxxxxxxxxxxxxxxxx,%d",
       name);//合法
printf("xxxxxxxxxxxxxxxx
        xxxxx",name);//不合法

(5)printf的返回值

返回printf打印的字符数,如果出错,返回一个负值。

(6)符号*

        使用*表示可变长度

double d = 1.234;
for (int i = 0; i < 4; i++)
{
	printf("%.*lf\n",i,d);//使用i代替*
}

显示:
1
1.2
1.23
1.234

 

2.scanf

(1)转换说明

转换说明符号输出
%c把输入解释为单个字符
%d把输入解释为有符号十进制整数
%e,%f,%g,%a把输入解释为浮点数
%E,%F,%G,%A把输入解释为浮点数
%i把输入解释为有符号十进制整数
%o把输入解释为无符号8进制数
%p把输入解释为指针(地址)
%s把输入解释为字符串,从第一个非空白字符开始到下一个空白字符之前
%u把输入解释为无符号十进制整数
%x,%X把输入解释为无符号十六进制整数

(2)转换说明符修饰符

*

抑制赋值

"%*d",对应的值不赋值

数字

最大字段宽度,输入达到最大字段宽度,会第一次遇到空白时停止

"%10s"

hh

把整数作为signed char或unsigned char 类型读取

"%hhd","%hhu"

ll

把整数作为long long或unsigned long long类型读取

"%lld","%llu"

h,l或L

"%hd"和"%hi"表明对应的值存储为short int类型

"%ho","%hx"和"%hu"表明对应的值存储为unsigned short int类型

"ld%"和"%li"表明对应的值存储为long类型

"%lo","%lx"和"%lu",对应的值存储为unsigned long

"%le","%lg"和"%lf"对应的值存储为double类型

在e,f,g前面使用L而不是l,表明对应的值存储为longdouble

如果没有修饰符,d,i,o和x表明对应的值存储为int类型,f和g表明对应的值存储为float类型

j

在整型转换说明后面时,表明使用intmax_t或uintmax_t类型

z在整型转换说明后面时,转换为sizeof类型值
t在整型转换说明后面时,表明使用表示两个指针差值的类型

(3)scanf的返回值

    返回成功读取到的项数

    读到文件为返回EOF

    读取错误返回0

 

3. printf和scanf不会进行自动数据类型转换

//实例
#include<stdio.h>
int main()
{

    int i;
    char c;
    for(i=0;i<5;i++)
    {
        scanf("%d",&c);
        printf("%d ",i);
    }
    return 0;
}

以上实例将char的c使用int输入,会存在一定的问题

scanf读入一个整数,后面应该是一个指向整型的地址,而是用一个指向字符的地址会导致不可预测的结果。

有种情况是i和c第地址连续,例如

c(8bit)i(0--7bit)i(7--15bit)i(16--23bit)i(24--31bit)

 

如果输入1时,将1作为整型输入,因此

c(8bit)--0x01i(0--7bit)--0x00(原来的0x01被覆盖)i(7--15bit)--0x00i(16--23bit)--0x00

i(24--31bit)--0x00

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值