您的位置:首页 > 其它

数据的输入输出

2011-01-07 12:02 225 查看
第一部分 数据输入/输出地概念及其在C语言中的实现

C语言中输入输出是以计算机为主体的。输入是指从标准输入设备(键盘)为程序中不同类型的变量赋值,输出是指向标准输出设备(显示器)输出表达式的值。

第二部分 数据的格式化输入

格式输入函数scanf,功能是按用户指定的格式,从键盘上把输入输入到指定的变量中。

2.1 格式化输入的格式

1.格式

scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,他是从键盘上输入的数据按指定的格式赋给相应的输入项。一般格式为:

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<stdio.h>

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<stdio.h>

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<stdio.h>

main(){

int a;

printf("input a number/n");

scanf("%d",&a);

printf("%ld/n",a);

}

运行结果为:
input a number
12345567678
44332456
由于输入数据的类型为整形,而输出语句的格式串中说明输出结果的类型为长整型,因此输出结果和输入结果不符,需对程序进行改进。
例4:当输入数据的类型改为长整型后,输入输出结果相等。

#include<stdio.h>
main(){
long a;
printf("input a number/n");
scanf("%ld",&a);
printf("%ld/n",a);
}

运行结果为:
input a number
1234567890
1234567890
例5:输入3个小写字母,输出其ASCII码值和对应的大写字母。

#include<stdio.h>
main(){
char a,b,c;
printf("input three character/n");
scanf("%c %c %c",&a,&b,&c);
printf("%d %d %d/n",a,b,c);
printf("%c %c %c/n",a-32,b-32,c-32);
}
运行结果:
input three character
a b c
97 98 99
A B C
2. 普通字符
数据输入格式:在输入时两个数据之间的格式与格式控制字符后的内容有关
1)格式控制字符后不跟任何内容时,数据输入时两个数据之间必须用空格隔开。如果是字符,则不必在其左边留空格。
例8:数据输入格式示例1

#include<stdio.h>
main(){
int a;
float b;
char c;
scanf("%d%f%c",&a,&b,&c);
printf("a=%d,b=%f,c=%c/n",a,b,c);
}
运行结果:
2 3.5f
a=2,b=3.500000f,c=f
2)格式控制字符后跟“,”时,输入数据时两个数据之间必须用“,”隔开。
例9:数据输入格式示例2

#include<stdio.h>
main(){
int a;
float b;
char c;
scanf("%d,%f,%c",&a,&b,&c);
printf("a=%d,b=%f,c=%c",a,b,c);
}

运行结果:
2,3.5,f
a=2,b=3.500000f,c=f

第三部分 数据的格式化输出

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.nf
以宽度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<stdio.h>

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)适用本函数前必须包含文件“stdio.h”。

2.字符输入函数putchar()

putchar()函数的功能是在显示器上输出单个字符。一般形式为:putchar(字符变量);

第五部分 字符串数据的输入/输出函数

1.puts()函数(字符串的输入函数)

puts()函数的功能是向标准输出设备(屏幕)写字符串并换行。其一般格式为:puts(s); 其中s为字符串变量(字符串数组名或字符串指针)。

说明:(1)puts()函数的功能与printf("%s/n",s);函数的功能基本相同。所不同的是puts()函数执行结束后自动换行,而printf("%s/n",s);函数只有当格式控制字符串中有“/n”时,才会自动换行。

(2)puts()函数只能输出字符串,不能输出数值或进行格式转换。

(3)可以将字符串直接写入puts()函数的自变量中。如:puts("Hello,TurboC2.0");

2.gets()函数(字符串的输入函数)

gets()函数的功能是从标准输入设备(键盘)读取字符串直到回车结束,但回车符不属于这个字符串。其一般格式为:gets(s);其中s为字符串变量(字符串数组名或字符串指针)。

输入字符串时使用gets函数与scanf函数的最大区别在于:gets函数在输入字符串时,可以输入空格,也就是说空格作为字符串的一部分输入。而scanf函数不能输入空格,即遇到空格时,认为字符串输入结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐