c语言printf,scanf的各种用法及易错点

scanf详解

声明

int scanf( const char *format [,argument]... );

返回值

Return Value

Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.

返回成功输入的字符数,若失败放回EOF。

特殊用法

1:

输入20030512 输出2003 05 12

上述题目若是不了解scanf的输入格式可能会用除余的办法把数分开,但其实只要在scanf的%d中间加上一个数字就可以指定域宽,如下

#include <stdio.h>
int main()
{
int year=0;
int month = 0;
int date = 0;
scanf("%4d%2d%2d", &year, &month, &date);//%4d就是读取4个字符宽的数
printf("year=%d\n", year);
printf("month=%02d\n", month);//输出不够2位时,左边拿0填充
printf("date=%02d\n", date);
return 0;
}
//输入:20030512
//输出结果:2003 05 12

2:

有人不小心将scanf当成printf使用,写成了scanf("d=%d\n",&a),请问要如何输入才能将数字1正确输入到变量a中?

答案是: d=1\n ,保证所有符号都与scanf格式一致,再将格式符%d换成我们想要的数字1。

3:

要注意scanf("%c",...)和scanf("%s",...)和gets(...)的用法,

%c会从缓冲区拿一个字符,因此要注意是否有多余的回车符'\n‘'或空格,特别是在与%s一起使用时

%s遇到空格或回车符就会停止,因此要输入一段有空格的字符串时要用gets,gets会读取空格和回车符,但不会将回车符存储起来,而是在puts时在结尾加上回车符,若你不用puts打印而是用printf("%s",...),那么打印出来的结果会缺少一个回车符。

int main()
{
    char arr1[10];
    char arr2[10];
    gets(arr1);//输入abc\n
    gets(arr2);//输入def\n

    printf("%s", arr1);
    printf("%s", arr2);
    //结果为abcdef

    puts(arr1);
    puts(arr2);
    //结果为abc\ndef\n
    return 0;
}

printf

声明

int printf( const char *format [, argument]... );

返回值

Return Value

Each of these functions returns the number of characters printed, or a negative value if an error occurs.

返回成功打印的字符数,若失败返回一个负数。

特殊用法

1:

int a=0x383a , 请问要如何打印0x0000383a

答案如下

int main()
{
    int a1=0x383a;
    int a2 = 0x0000383a;//相当于0x383a
    printf("%#010x\n", a1);//0x0000383a,所有字母均为小写
    printf("%#010X\n", a2);//0X0000383A,所有字母均为大写
    return 0;
}

“%#010x”解析:

'#'为修饰符,可以显示十六进制的前缀0x、八进制的前缀0;010的10是指打印十个字符,010前面的0是指当不够十位时在有效数字前补零。最终0x0000383a刚好十个字符。大写X打印出来的字母都是大写,小写x打印出来的字母都是小写。

2:

请分析一下程序打印结果

int main()
{
    printf("%%\\\n");
    printf("%d\n", sizeof("%%"));
    printf("%d\n", sizeof("\\"));
    return 0;
}

答案为:

%\

3

2

解析:

1.当我们要打印%时,必须用%%,此时会输出一个%,但他实际上是两个字符,再加上字符串的结尾标志'\0',一共是三个字符。%s,%d等等格式符也是同理。

2.而要打印\时要用\\,并且编译器会将\\当成一个字符。其他转义字符如\n \t 等等也是同理。

总结

格式符

对应的数据类型

含义

%d/%i

int

打印有符号十进制整数

%o

unsigned int

无符号八进制整数

%u

unsigned int

无符号十进制整数

%x/%X

unsigned int

无符号十六进制整数

%f

float

单精度浮点型,默认小数点后六位数

%lf

double

双精度浮点型,默认小数点后六位数

%e/%E

float/double

科学计数法打印浮点数

%a/%A

float/double

十六进制科学计数法打印浮点数

%g/%G

float/double

打印浮点数的有效位

%c

char

打印字符

%s/%S

char*

打印字符串

%p

void*

十六进制打印指针

%n

int*

到此字符之前为止,一共输出的字符个数,不输出文本

%%

无输入

打印%

示例:
printf("%5d\n",1000);               //默认右对齐,左边补空格
printf("%-5d\n",1000);              //左对齐,右边补空格
printf("%+d %+d\n",1000,-1000);     //输出正负号
printf("% d % d\n",1000,-1000);     //正号用空格替代,负号输出
printf("%x %#x\n",1000,1000);       //输出0x
printf("%.0f %#.0f\n",1000.0,1000.0)//当小数点后不输出值时依然输出小数点
printf("%g %#g\n",1000.0,1000.0);   //保留小数点后后的0
printf("%05d\n",1000);              //前面补0
  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值