发布时间:2022-09-04编辑:zhushican阅读(279)
C语言本身并不提供数据输入输出语句,有关输入输出操作都是由函数的调用实现的。C语言的标准函数库中提供了一些输入输出函数,如字符输入输出函数getchar()和putchar(),格式输入输出函数scanf()和printf()。在使用标准函数库时,必须用预编译命令“include”将相应的头文件包含到用户程序中。使用标准输入输出库函数时要用到的头文件是“stdio.h”,因此源文件开头应有以下预编译命令:
#include<stdio.h>
或
#include "stdio.h"
考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加头文件
2.2.1 字符的输入输出
在C语言中,输出字符使用putchar()函数,输入字符使用getchar()函数。
1.putchar 函数
字符输出函数,其功能是在显示器上输出单个字符。一般形式为:
putchar(c); /*c可以是字符型或整型的变量或常量。*/
例如:
putchar('A'); /*输出大写字母A */
putchar(x); /*输出字符变量x的值 */
putchar('\101'); /* 也是输出字符A */
putchar('\n'); /* 换行 */
对控制字符则执行控制功能,不在屏幕上显示。
【例2-18】输出单个字符。
#include<stdio.h>
int main()
{
chara='B',b='o',c='k';
putchar(a);putchar(b); putchar(b); putchar(c); putchar('\t');
putchar(a);putchar(b);
putchar('\n');
putchar(b);putchar(c);
putchar('\n');
return 0;
}
程序运行结果:
Book Bo
ok
2.getchar函数
键盘输入函数,其功能是从键盘上输入一个字符。一般形式为:
getchar();
通常把输入的字符赋予一个字符变量或整型变量,构成赋值语句,如:
char c;
c=getchar();
【例2-19】输入单个字符。
#include<stdio.h>
int main()
{
char c;
printf("input acharacter\n");
c=getchar();
putchar(c);
return 0;
}
程序运行结果:
input a character
n↙
n
使用getchar函数还应注意几个问题:
(1) getchar函数只能接受单个字符,输入数字也按字符处理,输入多于一个字符时,只接收第一个字符。
(2) 使用本函数前必须包含文件“stdio.h”。
(3) 在控制台下运行含本函数程序时,将进入等待用户输入,输入完毕返回控制台。
(4) 程序最后两行可用下面两行的任意一行代替:
putchar(getchar());
printf("%c",getchar());
2.2.2 格式输出函数printf()
printf函数称为格式输出函数,其功能是按控制字符串指定的格式,向显示屏输出指定的输出项。
printf函数调用的一般形式为:
printf(“格式控制字符串”, 输出项列表)
其中,输出项列表可以是常量、变量、表达式,其类型与个数必须与格式控制字符串中格式字符的类型、个数一致,当有多个输出项时,各项之间用逗号隔开。
格式控制字符串用于指定输出格式,格式控制字符串有格式说明字符串和普通字符串两种。若格式控制字符串中只有普通字符串时,后面没有输出项列表,如printf(“HelloWorld!”);,
用于程序中固定信息的输出。
格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。格式说明的一般格式为:
%[<修饰符>]<格式字符>
【例2-20】printf函数举例
#include <stdio.h>
int main()
{
int a=88,b=89;
printf("%d%d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
程序运行结果:
88 89
88,89
X,Y
a=88,b=89
本例中四次输出了a、b的值,但由于格式控制串不同,输出的结果也不相同。
第3行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格。
第4行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号。
第5行的格式串要求按字符型输出a、b值。
第6行中为了提示输出结果又增加了非格式字符串。
printf函数中使用的格式字符如表2-12所示:
表2-12 输出格式符说明
格式字符 | 意义 |
d | 以十进制形式输出带符号整数(正数不输出符号) |
o | 以八进制形式输出无符号整数(不输出前缀0) |
x,X | 以十六进制形式输出无符号整数(不输出前缀Ox) |
u | 以十进制形式输出无符号整数 |
f | 以小数形式输出单、双精度实数 |
e,E | 以指数形式输出单、双精度实数 |
g,G | 以%f或%e中较短的输出宽度输出单、双精度实数 |
c | 输出单个字符 |
s | 输出字符串 |
格式说明时,在%和上述格式字符间可以插入一些修饰符号进行格式说明如表2-13所示:
表2-13加修饰符的格式说明
格式说明 | 意义 |
%d | 按整数实际长度输出 |
%md | 数据最小宽度为m。若数据的位数小于m,则左端补以空格;若大于m,则按实际位数输出。 |
%-md | “-”为左对齐,若数据的位数小于m,则右端补以空格;若大于m,则按实际位数输出。 |
%ld | 输出长整型数据,可加在格式符d、o、x、u前面。 |
%.nf(%.ns) | 对实数,表示输出n位小数;对字符串,表示截取的字符个数。 |
%m.nf(%m.ns) | m为实数所占的总宽度(包括小数点),n为小数点后面的位数。对字符串,输出字符串总共占m列,但只去字符串中左端n个字符。 |
【例2-21】 printf函数举例
#include <stdio.h>
int main()
{
int a=15;
long floatb=123.1234567;
// %% 可以输出 %
printf("a(%%d)=%d,a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a);
printf("b(%%f)=%f,b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b);
return 0;
}
程序运行结果:
a(%d)=15,a(%5d)= 15,a(%o)=17,a(%x)=f
b(%f)=123.123457,b(%lf)=123.123457,b(%5.4lf)=123.1235,b(%e)=1.231235e+002
本例中,第11行以四种格式输出整型变量a的值,其中“%5d”要求输出宽度为5,而a值为15只有两位故补三个空格。
第14行以四种格式输出实型量b的值。其中“%f”和“%lf”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Visualc++6.0是按从右到左进行的。请看下面两个例子。
【例2-22】printf()语句中的表达式。
#include <stdio.h>
int main()
{
int i=8;
printf("The rawvalue: i=%d\n", i);
printf("++i=%d\n++i=%d \n--i=%d \n--i=%d\n",++i,++i,--i,--i);
return 0;
}
程序运行结果:
The raw value: i=8
++i=8
++i=7
--i=6
--i=7
【例2-23】修改例2-23的程序如下:
#include <stdio.h>
int main()
{
int i=8;
int a1=++i;
int a2=++i;
int a3=--i;
int a4=--i;
printf("The rawvalue: i=%d\n", i);
printf("a1=%d,a2=%d\n",a1,a2);
printf("a3=%d,a4=%d\n",a3,a4);
return 0;
}
运行结果:
The raw value: i=8
a1=9,a2=10
a3=9,a4=8
当使用自增、自减运算符作为函数的参数时,因为参数中表达式的运算顺序是从右到左的,有可能出现实际情况与设想之间存在差异。同时也反映了程序设计中有一个重要的原则:要尽可能地采用最简洁的语句来表达程序设计的思想,为了避免错误的发生,建议在函数的参数中少使用表达式。
显然,修改后的程序语句具有较好的可读性,每一条语句简洁明了。实际上,一个良好的程序,每一条语句都应该不是晦涩难懂的,不需要花费心思去揣摩程序语句的语法。
2.2.3格式输入函数scanf()
scanf函数称为格式输入函数,即从键盘上按指定的格式输入数据,并将输入数据的值赋给指定的变量。
scanf函数的一般形式为:
scanf(“格式控制字符串”, 输入项列表);
其中,格式控制字符串的作用与printf函数相同,但是这里只能使用格式字符串而不能使用普通字符串。输入项列表则由一个或多个变量地址组成,多个变量地址间用逗号“,”分隔。
例如:
&a、&b分别表示变量a和变量b的地址。
这个地址就是编译系统在内存中给a、b变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。
变量的地址和变量值的关系
在赋值表达式中给变量赋值,如:
a=567;
//a为变量名,567是变量的值,&a是变量a的地址。
但在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。
【例2-24】scanf函数举例
#include <stdio.h>
int main()
{
int a,b,c;
printf("inputa,b,c:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
程序运行结果:
input a,b,c:
7 8 9↙
a=7,b=8,c=9
或
input a,b,c:
7↙
8↙
9↙
a=7,b=8,c=9
在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,等待用户输入。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。
格式字符串的一般形式为:
%[<修饰符>]<格式字符>
格式字符的表示方法与printf()中的相同,各格式字符及其意义如表2-14所示。
表2-14 输入格式符说明
格式 | 字符意义 |
d | 输入十进制整数 |
o | 输入八进制整数 |
x | 输入十六进制整数 |
u | 输入无符号十进制整数 |
f或e | 输入实型数(用小数形式或指数形式) |
c | 输入单个字符 |
s | 输入字符串 |
格式说明中可以添加一些修饰符来进一步说明格式:
1.“*”符
用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。如:
scanf("%d %*d %d",&a,&b);
当输入为:1 2 3时,把1赋予a,2被跳过,3赋予b。
2.宽度
用十进制整数指定输入的宽度(即字符数)。例如:
scanf("%5d",&a);
输入12345678只把12345赋予变量a,其余部分被截去。又如:
scanf("%4d%4d",&a,&b);
输入12345678将把1234赋予a,而把5678赋予b。
3.长度
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
(1)scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
(2)scanf中要求给出变量地址,如给出变量名则会出错。如scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
(3)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
(4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。
例如:scanf("%c%c%c",&a,&b,&c);
输入dVef 则把'd'赋予a,'V' 赋予b,'e'赋予c。只有当输入为 def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。如果在格式控制中加入空格作为间隔,如:
scanf ("%c %c %c",&a,&b,&c);
则输入时各数据之间可加空格。
【例2-25】scanf函数举例
#include <stdio.h>
int main()
{
char a,b;
printf("inputcharacter a,b:\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
return 0;
}
程序运行结果:
input character a,b:
M N↙
M
由于scanf函数"%c%c"中没有空格,输入MVN,结果输出只有M。而输入改为MN时则可输出MN两字符。
【例2-26】scanf函数举例
#include <stdio.h>
int main()
{
char a,b;
printf("inputcharacter a,b:\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
return 0;
}
程序运行结果:
input character a,b:
M N↙
M N
本例表示scanf格式控制串“%c %c”之间有空格时,输入的数据之间可以有空格间隔。
5.如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:
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。
6.如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
【例2-27】输入的数据与输出的类型不一致
#include <stdio.h>
int main()
{
short a;
printf("input anumber:\n");
scanf("%d",&a);
printf("%ld\n",a);
return 0;
}
程序运行结果:
input a number:
1234567890↙
722
由于输入数据类型为短整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。如改动程序如下:
#include <stdio.h>
int main()
{
long a;
printf("input anumber:\n");
scanf("%ld",&a);
printf("%ld",a);
return 0;
}
程序运行结果:
input a number:
1234567890↙
1234567890
当输入数据改为长整型后,输入输出数据相等。
【例2-28】输出各种数据类型的字节长度
#include <stdio.h>
int main()
{
short s;
int a;
long b;
float f;
double d;
char c;
printf("short:%d\nint:%d\nlong:%d\nfloat:%d\ndouble:%d\nchar:%d\n",
sizeof(s),sizeof(a),sizeof(b),sizeof(f),sizeof(d),sizeof(c));
return 0;
}
程序运行结果:
short:2
int:4
long:4
float:4
double:8
char:1
【例2-29】输入三个小写字母,输出其ASCII码和对应的大写字母。
#include <stdio.h>
int main()
{
char a,b,c;
printf("input character a,b,c:\n");
scanf("%c %c%c",&a,&b,&c);
printf("%d%d%d\n%c%c%c\n",a,b,c,a-32,b-32,c-32);
return0;
}
程序运行结果:
input character a,b,c:
x y z↙
120 121 122
X Y Z