C语言的键盘输入和屏幕输出

键盘输入和屏幕输出是编写简单的顺序结构程序时最常用到的操作。C程序中的键盘输入和屏幕输出都是通过调用输入/输出函数实现的。本章介绍常用的输入/输出函数。
一、单个字符的输入/输出
1.字符常量
C语言中的字符常量是用单引号括起来的一个字符。例如,‘a’是字符常量,而a则是一个标识符。再如,‘3’表示一个字符常量,而3则表示一个整数。
把字符放在一对单引号的做法,适用于多数可打印字符,但不适用于某些控制字符(如回车符、换行符等)。因此,C语言中还引入了另外一种特殊形式的字符常量一转义字符(Escape Character),它是以反斜线(\)开头的字符序列,它有特定的含义,用于描述特定的控制字符,使用时同样要放到一对单引号内。常用的转义字符如’\n’,’\t’。
转义字符表如下表。

字符 含义 字符 含义
‘\n’ 换行 ‘\a’ 响铃报警提示声
‘\r’ 回车(不换行) ‘\“‘ 一个双引号
‘\0’ 空字符,通常用做字符串结束标志 ‘\’’ 单引号
‘\t’ 水平制表 ‘\’ 一个反斜线
‘\v’ 垂直制表 ‘?’ 问号
‘\b’ 退格 ‘\ddd’ 1到3位八进制ASCII码值所代表的字符
‘\f’ 走纸换页 ‘\xhh’ 1到2位十六进制ASCII码值所代表的字符

例如,前几章的程序实例中涉及的字符’\n’,就是一种转义字符,它用于控制输出时的换行处理,即将广播移到下一行的起始位置。与’\n’不同的是的,’\r’则表示回车,但不换行,即将广播移到当前行的起始位置。而’\t’为水平制表符,相当于按下TAB键。
另外值得注意的是:转义序列出现在字符串中时,是按单个字符计数的。例如,字符串”abc\n“的长度是4而非5.因为字符’’\n’代表1个字符。
由于字符型变量仅占1个字节的内存空间,因此它只能存放1个字符。字符型变量的取值范围取决于计算机系统所使用的字符集。目前计算机上广泛使用的字符集是ASCII码(美国标准信息交换码)字符集(可参考程序软件上的字符表)。该字符集规定了每个字符所对应的编码,即在字符序列中的“序号”。也就是说,每个字符都有一个等价的整型值与其相对应,这个整型值就是该字符的ASCII码。从这个意义上而言,可将char型看成是一种特殊的int型。
一个整型数在内存中是以二进制形式存储的,而一个字符在内存中也是以其对应的ASCII码的二进制形式存储的。例如,字符’A’在内存中存储的是其ASCII码65的二进制值,存储形式与整型数65类似,只是在内存中所占的字节数不同而已。char型数据占1个字节。
在ASCII码取值范围内,对char型数据和int型型数据进行相互转换不会丢失信息,二者可以进行混合运算。同时,一个char型数据既能以字符型格式输出,也能以整型格式输出,以整型格式输出时就是直接输出其ASCII码的十进制值。
2.字符的输入/输出
getchar()putchar()是C标准函数库中专门用于字符输入/输出的函数。函数putchar()的作用是把一个字符输出到屏幕的当前广播位置。而函数getchar()的作用是从系统隐含指定的输入设备(即将端键盘)输入一个字符,按回车键表示输入结束,读入的字符会自动被回显到屏幕上。
【例11.1】从键盘输入一个大写英文字母,将其转换为小写字母后,再现实到屏幕上。
【问题求解分析】观察附录D中的常用ASCII字符表,可以发现这样一个规律,即小写英文字母的ASCII码值比相应的大写英文字母的ASCII码值大32,即’a’与’A’、’b’与’B’、’c’与’C’……的ASCII码值均相差32。根据这一规律,可轻松实现大小写英文字母之间的转换。程序如下:
#include “stdio.h”
void main()
{
char ch;
printf(“press a key and then press enter:”);
ch=getchar(); /从键盘输入一个字符,按回车键结束,该字符存入变量ch/
ch=ch+32; /将大写字母转换了小写字母/
putchar(ch); /大屏幕上显示变量ch中的字符/
putchar(’\n’); /输出一个回车换行控制符/
}
程序的运行结果如下:
Press a key and then press enter:B
b
程序第6行语句首先调用函数getchar()从键盘输入一个字符,然后将读入的字符即函数getchar()的返回值赋值给字符型变量ch。注意,函数getchar()没有参数,函数的返回值就是从终端键盘读入的字符。因此,不要把该语句写成如下形式:
getchar(ch);/错误的使用方法/
第7行语句将变量ch中的大写英文字母的ASCII码值加上32,即可得到相应的小写英文字母的ASCII码值,从而实现大写英文字母到小写英文字母的转换。由于字符’a’与字符’A’相减,相当于字符’a’与字符’A’的ASCII码值相减,也相当于字符’b’与字符’B’的ASCII码值相减……而二者相减的差值就是32,因此第7行语句与下面的语句是等价的;
ch=ch+(‘a’-’A‘);
第8行语句调用函数putchar()向终端显示器屏幕的当前光标位置输出ch中的字符,函数putchar()的参数就是待输出的字符,这个字符既可以是可打印字符,也可以是转义字符。
二、数据的格式化屏幕输出
函数printf()的一般格式
printf(格式控制字符串);
printf(格式控制字符串,输出值是参数表);
其中,格式控制字符串(format string)是用双引号括起来的字符串,也称转换控制字符串,输出值参数表可有多个输出值,也可没有(只输出一个字符串时)。一般情况下,格式控制字符串包括两部分:格式转换说明(Format Specifier)和需原样输出的普通字符。如表4—2所示,格式转换说明有%开始,并以转换字符(Conversion Character)结束,用于指定各输出值参数的输出格式。
常用函数printf()的格式转换说明
格式转换说明 用法
%d 输出带符号的十进制整数,正数的符号省略
%c 输出一个字符
%s 输出字符串
%f 以十进制小数形式输出实数
%% 输出百分号%%

输出值参数表是需要输出的数据项的列表,输出数据项可以使变量或表达式,输出值参数之间用逗号分隔,其类型应与格式转换说明符相匹配。每个格式转换说明符和输入值参数表中的输出值参数一一对应,没有输出值参数时,格式控制字符串中不再需要格式转换说明符。
【例4.2】从键盘输入一个大写的英文字母,将其转换为小写英文字母后,将转换后的小写英文字母及其十进制的ASCII码值显示到屏幕上。
#include “stdio.h”
void main()
{
char ch;
printf(“press a key and then press enter:”);
ch=getchar(); /从键盘输入一个字符,按回车键结束,该字符存入变量ch/
ch=ch+32; /将大写字母转换了小写字母/
putchar(ch); /大屏幕上显示变量ch中的字符/
printf(“%c,%d\n”,ch,ch);
}
程序的运行结果如下:
Press a key and then press enter:B
b,98
程序运行结果如下:
与例11.1程序相比,这个程序改用格式化输出函数printf()来输出字符,与输出字符的函数putchar()相比,函数printf()的优势是既能以字符格式(%c)也能以十进制整型格式(%d)输出char型变量的值(如程序第8行所示)。以十进制整型格式(%d)输出时输出的是char型变量的ASCII码值。这里,下面两条语句的作用是等价的。
printf(“%c”,ch);
putchar(ch);
而下面两条语句的作用也是等价的。
printf(“\n”);
putchar(‘\n’);
三、数据的格式化键盘输入
1.函数scanf()的一般格式
scanf(格式控制字符串,参数地址表);
其中,格式控制字符串是用双引号括起来的字符串,它包括格式转换说明符和分隔符两个部分。函数scanf()的格式转换说明符(如表4-4所示)通常由%开始,并以一个格式字符结束,用于指定各参数的输入格式。
格式转换说明 用法
%d 输入十进制整数
%c 输入一个字符,空白字符(包括空格、回车、制表符)也是有效字符
%s 输入字符串,遇到空白字符(包括空格、回车、制表符)时,系统认为读入结束。
%f 输入实数、以小数或指数形式输入均可
%% 输出百分号%%

参数地址表是由若干变量的地址组成的列表,这些参数之间用逗号分隔。函数scanf()要求必须指定用来接收数据的变量的地址,否则数据不能正确读入指定的内存单元。
2.函数scanf()中的格式修饰符
与prinf()类似,在函数scanf()的%和格式符中间也可插入格式修饰符。
在用函数scanf()输入数值型数据时,遇到以下几种情况都认为数据输入结束:
遇空格符,回车符,制表符(TAB)
达到输入域宽;
遇非法字符输入。
注意,如果函数scanf()的格式控制字符串存在除格式说明符以外的其他字符,那么这些字符必须在输入数据时由用户从键盘原样输入。
【例4.4】下面程序用于演示函数scanf()对输入数据的格式要求。
#include “stdio.h”
void main()
{
int a,b;
scanf("%d %d",&a,&b);
printf(“a=%d,b=%d\n”,a,b);
}
当要求程序输出结果为a=12,b=34时,用户应该如何输入数据?
答:因为程序第5行语句中的两个格式转换说明符之间是空格符,作为普通字符,它必须在用户输入时原样输入,即输入数据之间应以空格作为分隔符。所以此时应按以下格式输入数据:
12 34
当限定用户输入数据以逗号为分隔符,即输入数据限定为以下格式时,应修改程序中的哪条语句?怎样修改?
12,34
答:如果要求输入数据之间以逗号分隔,那么两个格式转换说明符之间必须以逗号分隔,即应该将程序第5行语句修改为
scanf("%d,%d",&a,&b);
当程序第5行语句修改为如下语句时,用户应该如何输入数据?
使用函数scanf()时忘记在变量前面加上取地址运算符,以指定用来接收数据的变量的地址,这是一个初学者常犯的错误。
常见错误实例 常见错误描述 错误类型
printf(“Input a:”);
Printf(“Input a:”); 将printf()误写为print()或者Printf(). 链接错误
printf(“Input a:);
scanf(%d”,&a); 忘记给printf()或scanf()中的格式控制字符串加上双引号 编译错误
scanf(“%d,”&a);
printf(“a=%d,”a); 将分隔格式控制字符串和表达式的逗号写到了格式控制字符串内 编译错误
Scanf(“%d”,a); 忘记给scanf()中的变量加上取地址符 提示warning
printf(“a=%d\n”); 忘记写输出变量参数 运行时错误
scanf(“%.2f”,&c); 用scanf()输入实型数据时在格式控制字符串中规定了精度 运行时错误

猜你喜欢

转载自blog.csdn.net/SqrsCbrOnly1/article/details/91361750