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