第一部分 数据输入/输出地概念及其在C语言中的实现
C语言中输入输出是以计算机为主体的。输入是指从标准输入设备(键盘)为程序中不同类型的变量赋值,输出是指向标准输出设备(显示器)输出表达式的值。
第二部分 数据的格式化输入
格式输入函数scanf,功能是按用户指定的格式,从键盘上把输入输入到指定的变量中。
2.1 格式化输入的格式
1.格式
scanf函数是一个标准库函数,它的函数原型在头文件“”中,他是从键盘上输入的数据按指定的格式赋给相应的输入项。一般格式为:
scanf("格式控制字符串","输入项列表");
其中,格式控制字符串的作用是控制输入项列表中各输入项的输入格式,但不能显示非格式字符串,也就是不能显示提示字符串。提示字符串一般包括普通字符串和格式控制字符串。输入项列表则由一个或多个变量的地址组成,当变量地址有多个时,各变量地址之间必须用逗号“,”分隔。变量地址是由地址运算符“&”后跟变量名组成的。这个地址就是编译系统在内存中分配的地址。
2.地址的概念
变量的地址是C编译系统分配的,用户不必关心具体的地址是什么。
变量的地址和变量值的关系如下:
&a----->a 567
a为变量名,567为变量的值,&a是变量a的地址。在scanf语句的格式中,输入时要用一个以上的空格或<Enter>键作为每两个输入数之间的间隔。
2.2 格式控制字符和普通字符
1.格式控制字符
格式控制字符串规定了输入项中变量以何种类型的数据格式被输入,应包括由“%”引导的修饰符和格式字符。其一般格式如下:
%[<修饰符>]<格式字符>
说明:方括号中的内容为可选项。
1)格式字符及其意义
格式字符 |
意义 |
d |
输入一个十进制整数 |
0 |
输入一个八进制整数 |
x |
输入一个十六进制整数 |
f |
输入一个小数形式的浮点数 |
e |
输入一个指数形式的浮点数 |
c |
输入一个字符 |
s |
输入一个字符串 |
2)修饰符的可选项,可以有也可以没有,如果有修饰符,则它可以是:
A. 修饰字段宽度的数字
用十进制整数指定输入的宽度(即字符串)。例如,scanf("%3d","&a");指按宽度3输入一个整数赋给变量a.
B. 字符l和h
可以和d、0、x一起使用,加l表示输入长整数类型(如%ld)和双精度浮点数(如%lf)。加h表示输入的数据为短整型数据,例如,scanf("%10ld%hd",&x,&i);表示x按宽度为10的长整数读入,而i按短整型读入。
C. 字符*
“*”表示输入该字符值后,不将该值赋予相应的变量,即跳过该输入值。例如,scanf("%4d%*d%4d"&x,&y,&z,);执行该语句,若输入为:1 2 3,则结果为x=1,z=3,y未赋值,2被跳过。
3)使用scanf函数须注意以下几点:
A. scanf函数中没有精度控制,如scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数位为2位的整数。
B. sacnf中要求给出变量地址,若给出变量名则会出错。如scanf("%d",a);是非法的,应改为scanf("%d",&a);才是合法的。
C. 在输入多个数值数据时,若格式控制串中没有非格式字符作为输入数据之间的间隔,则可用空格,<Tab>键或<Enter>键作为间隔。C编译在碰到空格,<Tab>键或<Enter>键或非法数据(如对"%d"输入"12A"时,A即为非法数据)时即认为该数据输入结束。
D. 在输入字符数据时, 若格式控制串中无格式字符,则认为所有输入的字符均为有效字符。
如:
scanf("%c%c%c",&a,&b,&c);
输入为:d e f 则把'd'赋给a,' '空格赋给b,'e'赋给c.只有输入def时,才会把'd'赋给a,'e'空格赋给b,'f'赋给c。如果在格式控制中加入空格作为间隔,如scanf("%c %c %c",&a,&b,&c);则输入时各数据之间必须加空格。
例1:scanf函数输入字符时的技巧1
#include<>
main(){
char a,b;
printf("input character a,b/n");
scanf("%c%c",&a,&b);
printf("%c%c/n",a,b);
}运行结果为:
input character a,b
M N
M
input character a,b
MN
MN
由于scanf函数"%c%c"中没有空格,输入M N时,输出结果只有M,因为N接受的是空格。而当输入MN时,则可输出MN两个字符。
例2:scanf函数输入字符时的技巧2
#include<>
main(){
char a,b;
printf("input character a,b/n");
scanf("%c %c",&a,&b);
printf("/n%c%c/n",a,b);
}
运行结果为:
input character a,b
M N
MN
本例表示scanf格式控制串"%c %c"之间有空格,输入的数据之间也必须有空格间隔。
E. 如果格式控制串中有非格式字符,则输入时必须输入该给格式字符。
如:
scanf("%d,%d,%d",&a,&b,&c); 其中用非格式符“,”作为间隔符,故输入时的格式应为:5,6,7
又如:
scanf("a=%d,b=%d,c=%d",&a,&b,&c); 输入时的格式应为:a=5,b=6,c=7
F. 如输入的输入和输出地类型不一致,虽然能够通过编译,但结果却不正确。
例3:输入的数据和输出的类型一致性问题
#include<>
main(){
int a;
printf("input a number/n");
scanf("%d",&a);
printf("%ld/n",a);
}
第三部分 数据的格式化输出
1.数据的格式化输出格式
printf函数的功能是按格式控制字符串控制的格式,向默认输出设备(一般为显示器)输出在输出列表中列出的各输出项的值,其基本格式为:
printf("格式控制字符串","输出项列表");
输出项可以为常量、变量或表达式,其类型、顺序与个数必须与格式控制字符串中格式控制字符的类型、顺序与个数一致,当有多个输出项时,各项之间用逗号隔开。格式控制字符必须用双引号括起来,它包括格式控制符、转义字符和普通字符3类字符。
2. 格式控制字符和普通字符
(1)格式控制字符
一般格式为:
%[<修饰符>]<格式字符>
格式字符规定了相应输出项的输出格式,常见格式控制字符如下表:
格式字符 |
作用 |
%d或%i |
以带符号的十进制形式输出整数(正数不输出符号) |
%o |
以八进制无符号形式输出整数(不输出前导0) |
%x或%X |
以十六进制无符号形式输出整数(不输出前导0x),格式说明字符用x时以小写形式输出十六进制数码a~f,用X时输出对应的大写字母 |
%u |
以十进制无符号形式输出整数 |
%c |
以字符型数输出一个字符 |
%s |
输出字符串中的字符,直到遇到‘/0’ |
%f |
以小数形式输出单、双精度数,默认输出6位小数 |
%e或%E |
以标准指数形式输出单、双精度数,小数部分默认输出6位小数,格式说明字符用e时指数以“e”表示,用E时指数以“E”表示 |
%g或%G |
由系统自动选定%f或%e格式,以使输出宽度最小,无输出无意义的0,用G时若以指数形式输出则选择大写字符。 |
修饰符是可选的,用于确定数据输出的宽度、精度、小数位数和对齐方式等,用于产生更规范、整齐的输出。当没有修饰符时,以上各项按系统默认设定显示。
1)字符宽度修饰符,如下表:
修饰符 |
格式说明 |
意义 |
m |
%md |
以宽度m输出指定的整型数,不足m位时,左边用空格补齐 |
0m |
%0md |
以宽度m输出指定的整型数,不足m位时,左边用0补齐 |
m,n |
% |
以宽度m输出指定的整形小数(包括小数点),小数位为n位 |
例如,设i=123,a=12.34567,则printf("%4d+ + +%5.2f",i,a);输出:123+ + 12.35;printf("%2d+ + +%2.1f",i,a);输出123+ + +12.3
可以看出,当指定宽度小于数据的实际宽度时,对整数,按该数的实际宽度输出,对浮点数,相对于小数位上的数四舍五入。例如,12.34567按%5.2f输出,输出12.35。若宽度小于等于浮点数整数部分的宽度,则该浮点数按实际位数输出,但小数位数仍遵守宽度修饰符给出的值。如上面的12.34567按%2.1f输出,结果为12.3.
在实际应用中,还有一种更为灵活的宽度控制方法,用常量或变量的值作为输出宽度,方法是以一个“*”作为修饰,插入到%之后。
例如,设i=123,printf("%*d",5,i);此处宽度为5,输出为:123。程序中可以用一个整型变量k来指示宽度:printf("%*d",k,i);可以根据k的值动态的决定i的显示宽度,这在解决某些问题时是十分有用的。
2)对齐方式修饰符。负数“-”为“左对齐”控制符,一般默认所有输出数据为右对齐格式,加一个“-”号,则变为“左对齐”。
例如,i=123,a=12.34567,printf("%4d/t%10.4f",i,a);输出为:
/ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
0 |
|
1 |
2 |
3 |
|
|
|
|
|
|
|
1 |
2 |
. |
3 |
4 |
5 |
6 |
7 |
|
|
printf("%-4d/t%10.4f",i,a);
/ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
0 |
1 |
2 |
3 |
|
|
|
|
|
|
|
|
1 |
2 |
. |
3 |
4 |
5 |
6 |
7 |
|
|
printf("%4d/t%-10.4f",i,a);
/ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
0 |
|
1 |
2 |
3 |
|
|
|
|
1 |
2 |
. |
3 |
4 |
5 |
6 |
7 |
|
|
|
|
|
3)l和h。可以与输出格式字符d、f、u等连用,以说明使用long型还是short型格式输出输入,如:
%hd表示以短整型输出对应表达式的值。
%lf表示以双精度型输出对应表达式的值。
%ld表示以长整型输出对应表达式的值。
%hu表示以无符号短整型输出对应表达式的值。
(2)普通字符
普通字符包括可打印字符和转义字符,可打印字符主要是一些说明字符,这些字符按原样显示在屏幕上。转义字符是不可打印的字符,他们其实是一些控制字符,控制产生特殊的输出效果。
例如,i=123,n=456,a=12.3457,且i为整形,n为长整型。输出为:
/ |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
|
|
1 |
2 |
3 |
|
|
|
|
1 |
2 |
. |
3 |
4 |
5 |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
5 |
6 |
|
|
|
|
|
|
|
|
|
|
其中“/t”为水平制表符,作用是跳到下一个水平制表位,在不同计算机中,水平制表位的宽度可能是不一样的,这里设为8个字符宽度。那么“/t”跳到下一个8的倍数的列上。“/n”为<Enter>换行符,遇到“/n”,自动换到新的一样显示。
在C语言中,如果要输出“%”,则在控制字符中用两个“%”表示,即“%%”。
例10:分析下列程序的执行结果。
#include<>
main(){
int a=16;
char e='A';
unsigned b;
float d;
b=65535;
d=123.45;
printf("a=%d,%4d,%-6d/n",a,a,a);
printf("%o,%x,%u,%d/n",b,b,b,b);
printf("%f,%e,%13.2e,%g/n",d,d,d,d);
printf("%c,%s,%7.3s/n",e,"China","Beijing");
}
运行结果为:
a=16, 16,16
177777,ffff,65535,65535
123.449997,1.234500e+002, 1.23e+002,123.45
A,China, Bei
第四部分 字符数据的输入/输出
1.字符输入函数getchar()
getchar()函数的功能是从键盘上输入一个字符。其一般形式为:getchar();通常把输入的字符赋给一个字符变量,构成赋值语句,如:
char c; c=getchar();
使用getchar()函数应注意的问题:
(1)getchar()函数只能接受单个字符,输入数字也按字符处理。输入多个字符时,只接收第一个字符。
(2)适用本函数前必须包含文件“”。
2.字符输入函数putchar()
putchar()函数的功能是在显示器上输出单个字符。一般形式为:putchar(字符变量);
第五部分 字符串数据的输入/输出函数
()函数(字符串的输入函数)
puts()函数的功能是向标准输出设备(屏幕)写字符串并换行。其一般格式为:puts(s); 其中s为字符串变量(字符串数组名或字符串指针)。
说明:(1)puts()函数的功能与printf("%s/n",s);函数的功能基本相同。所不同的是puts()函数执行结束后自动换行,而printf("%s/n",s);函数只有当格式控制字符串中有“/n”时,才会自动换行。
(2)puts()函数只能输出字符串,不能输出数值或进行格式转换。
(3)可以将字符串直接写入puts()函数的自变量中。如:puts("Hello,TurboC2.0");
()函数(字符串的输入函数)
gets()函数的功能是从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其一般格式为:gets(s);其中s为字符串变量(字符串数组名或字符串指针)。
输入字符串时使用gets函数与scanf函数的最大区别在于:gets函数在输入字符串时,可以输入空格,也就是说空格作为字符串的一部分输入。而scanf函数不能输入空格,即遇到空格时,认为字符串输入结束。