使用输入输出函数时,一定要加上#include <stdio.h>
输出格式:
%i -- 以十进制整数输出
%u -- 以十进制无符号整数输出
%o -- 以八进制无符号整数输出(不输出前导符0)
%x -- 以十六进制无符号整数输出(不输出前导符0x)
%#x -- 以十六进制无符号整数输出,并输出前导符0x
%c -- 输出一个字符型数据
%s -- 输出一个字符串
%e -- 以指数形式输出一个浮点型数据
%f -- 以十进制小数形式输出一个浮点型数据
printf("a = %md\n", a); // 数据最小宽度>m,正常输出;<m,左补空格
// 不论是对实数,还是对字符串,都表示输出的宽度
printf("a = %m.nf", a); // 对实数,m表示宽度,n表示输出n位小数
printf("a = %m.ns", ch); // 对字符串,m表示宽度,n表示截取的字符个数
c = getchar() -- 输入单个字符(scanf("%c", c)的替代品)
c = gets() -- 输入字符串(和scanf("%s", c)不同的是,
scanf以空白符结束,gets()只有遇到回车键才结束)
putchar(k) -- 输出一个字符
puts(str) -- 输出一个字符串
【注】
float a = 1.5, b = 3;
int d;
d = (int)a;
执行语句printf("%f", (float)a); 结果为?
答:
d = (int)a; // 从float变为int,报错
【注】从int到float、double可以
但从float到int会出错
使用scanf函数时,所跟的变量前面一定不要忘了添加取地址&号!
scanf("%d\n", &a);
scanf中没有精度控制!例如不能输入形如scanf("%5.2f", &a);
但scanf中允许设置域宽:scanf("%5d", &a);
scanf()函数格式字符:(h:读取short型数据 l:读取long型数据)
%c:读取一个字符
%d、%hd、%ld:读取一个十进制整数,分别赋给int、short、long
%o、%ho、%lo:读取一个八进制整数,分别赋给int、short、long
%x、%hx、%lx:读取一个十六进制整数,分别付给int、short、long
%f、%lf:读取一个十进制小数,分别赋给float、double类型
%e、%le:读取一个指数形式的小数,分别赋给float、double类型
%s:读取一个字符串,以空白符结束
域宽详细介绍:
%nd -- 指定输出字段的宽度为n
若实际长度不够n位则右对齐,左端补以空格;若大于n位则按原数据输出
%04d -- 输出一个小于4位的数值时,在其前面补0使其总宽度为4位
%m.ns -- 输出列宽为m,但只取字符串中左端n个字符;这n个字符输出在m列的右侧,左补空格
%-10s -- 设置列宽为10,这些字符输出在左侧
若字符串实际长度小于10则左对齐,右补空格;若大于10则按原字符串输出
域宽实例:
scanf("%5d", &a); // 输入12345678 --> 只把12345赋给a,其余部分被舍去
scanf("%4d%4d", &a, &b); // 输入12345678 --> 只把1234赋给a,而把5678赋给b
【错题】
1.printf("s=%-5.3s", "student"); 的输出结果为?
2.以下程序的输出结果为?
int main()
{
int x = 102, y = 012;
printf("%2d,%2d\n", x, y);
return 0;
}
【答案】
1. s=stu口口
'-'表示如果所取的字符串长度n比列宽m要小,则左对齐并右端输出空格;否则将原串全部输出
5为列宽,3为所取的字符串长度
2. 102,10
'%2d'表示设置宽度为2
如果实际的数据宽度大于设置的宽度,则按照原数据输出
否则右对齐,左端补充空格
x = 102; printf("%2d", x); --> x实际的宽度大于设置的宽度2,因此按原数据输出102
y = 012; printf("%2d", y); --> y为八进制数据,首先需转为十进制(12对应的十进制为10)
十进制的宽度等于设置的宽度2,因此按原数据输出10