1 printf()函数
最末一个字母f即为“格式”(format)。printf("格式控制字符串",表达式1,表达式2,...,表达式n);
- 格式控制字符串包括
- 常规字符:包括可显示字符和用转义字符表示的字符。
- 格式控制符:以
%
开头的一个或多个字符,如%d
。%
后面的是格式转换字符。
tip:想要显示 **%**
,必须在格式控制字符串中用 **%%**
来替代单个 **%**
。
- 使用printf函数要注意以下几点:
- 格式控制字符串可以不包含任何格式控制符。
printf("how are you?\n");
printf("how old are you?\n",20);
//带有参数20,但无意义也可。
- 如果格式控制字符串中格式控制符的个数多于表达式的个数,则余下的格式控制符的值将是不确定的。当然,如果少于表达式的个数,则不影响输出。
例如,printf("5+3=%d,5-3=%d,5*3=%d",5+3,5-3);
输出结果: 5+3=8,5-3=2,5*3=-28710
。此处的-28710就是随机的。
- 输出时表达式值的计算顺序是从右到左。
例如, int i=1;printf("%d,%d,%d\n",i,i+1,i=3);
输出结果: 3,4,3
格式转换符 | 含义 | 对应的表达式数据类型 |
---|---|---|
%d或%i | 以十进制输出整型 | 有符号整型 |
%x、%X | 以十六进制输出无符号整型int a=164; printf("%x",a); //输出a4printf("%X",a); //输出A4 |
无符号整型 这里的无符号即,将待输出数直接进行除法转换为对应进制,无需进行反码转换 |
%o | 以八进制输出无符号整型 | 无符号整型 |
%u | 以十进制输出无符号整型 | 无符号整型 |
%c | 输出一个字符型 | 字符型 |
%s | 输出一个字符串 | 字符串 |
%f | 以十进制小数形式输出一个浮点型数据 | 浮点型 |
%e、%E | 以指数形式输出一个浮点型数据float f=1234.8998; printf("%e",f); //输出1.234900e+003printf("%E",f); //输出1.234900E+003 |
浮点型 |
%g、%G | 按照%f或%e中输出宽度比较短的一种格式输出 | 浮点型 |
%p | 以主机的格式显示指针 | 指针类型 |
- 可以在格式转换字符和
%
之间插入一些辅助的格式控制字符。
%[flag][width][.precision][size]Type
- 表示可以缺省
- width和precision都必须是无符号的整数。presion前的
.
不能省略。 - Type就是上表列出的格式转换符
- printf中辅助格式控制字符 | 修饰符 | 功能 | 例子 | | —- | —- | —- | | width | 输出数据域宽,当数据长度<width时,补空格,否则按数位输出 | %4d表示输出至少占4格 | | .precision | 对于整数,表示至少要输出precision位。数据长度小于precision时,左边补0 | | | | 对于实数,指定小数点后的位数 | | | | 对于字符串,表示只输出字符串的前precision个字符 | | | - | 输出数据左对齐(默认右对齐) | | | + | 输出有符号正数时,在前面显示+ | | | 0 | 输出数值时指定左边需要补位时自动填0 | | | # | 对于无符号数,在八进制和十六进制数前显示前导0,0x或0X | | | | 对于实数,必须输出小数点 | | | h | 在d/o/x/u前,指定输出为短整型数(short) | | | l | 在d/o/x/u前,指定输出为long int型 | | | | 在e/f/g前,指定输出精度为double型(默认时也为double) | | | L | 在e/f/g前,指定输出精度为long double型 | |
2 scanf函数
scanf("格式控制字符串",变量1的地址,变量2的地址,...,变量n的地址);
例如,int a;
scanf("%d",&a);
&
符号的功能是取变量的地址,因此称为取地址运算符。它与++,sizeof等运算符具有相同的优先级。
- &只能作用于变量,不能作用于表达式。如
&(a+1)
是错误的。
2.1 scanf函数的格式控制符的一般形式
%[*][width] [l|h]Type
- :表示可选项,可省略。
- |:表示互斥关系
- width:指定输入数据的域宽,遇到空格或不可转换字符则结束。
- *:翼支付,输入的数据不会赋值给相应的变量。
- l:long
- h:short
需注意:
- 相邻两个格式控制符之间,不指定数据分隔符(如逗号、冒号等),则输入时至少用一个空格分割,或者用Tab键分隔,或输入一个数据后,回车再输入下一个。
- 格式控制字符串中的转义字符,如
\n
,系统不会将其当做转义字符来解释,而是视其为普通字符,所以需原样输入。
如int`` ``num1``,``num2``;
scanf``(``"num1=``%d``,num2=``%d``\n``"``,``&``num1``,``&``num2``);
printf``(``"``%d`` ``%d``"``,``num1``,``num2``);
只有输入 num1=12,num2=36\n
才会正常输出 12 36
- 当格式控制字符串中指定了输入数据的域宽width时,将读取输入数据中相应的width位,但按需要的位数赋给相应的变量,多余部分被舍弃,例如
scanf("%3c%3c",&ch1,&ch2);
输入 abcdefg
,则将 abc
中的a赋值给ch1,将 def
中的d赋值给ch2.
- 当格式控制字符串含有抑制符“*”时,表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。例如
scanf("%2d%*2d%3d",&num1,&num2);
printf("num1=%d,num2=%d\n",num1,num2);
假设输入123456789,则系统将读取12赋值给num1,读取34但舍弃掉,读取567并赋值给num2。
- 输入数据时,遇到一下情况,系统认为输入结束:
- 遇到空格、回车或Tab
- 遇到输入域宽度结束。例如“%3d”,只取3列。
- 遇到非法输入。
在输入数据类型和字符类型的两个scanf函数调用之间通常要使用
fflush
库函数以清楚键盘缓冲区中的字符。
因为scanf函数首先将用户输入的文本存放在内部的缓冲区,如果在连续输入时,下一项输入为字符型,那么不进行fflush清楚缓存时,将会把上一项输入结束时的 回车
读入字符型变量。
3 字符数据的非格式化输入输出
3.1 字符数据的非格式化输入
3.1.1 getchar()
int getchar(void);
- 所处头文件:stdio.h
- 读取用户的按键信息,返回值为按键的ASCII码
- 在调用getchar之前,输入了多个字符(这些字符将会被保存在缓冲区中),则getchar将会从缓冲区中读取输入的第一个字符;而剩余的字符将会继续保存在缓冲区中,等待后来的getchar获取。这意味着后续的getchar不会等待用户按键输入。
3.1.2 getc()
int getc(FILE *stream);
- 从流文件stream中读取一个字符信息,它的返回值是所读取字符的ASCII码
-
3.1.3 getche()和getch()
- 所处头文件:conio.h
- 直接从键盘获取值,不等待用户按下回车。
- 两者的差别是,getche()会在页面上立刻显示读取的字符,而getch()不会。
- 由于getch()的特性,常用于调试程序,达到使程序暂停的效果,继而按下任意键继续。