2.7.2 字符输入函数getchar()和格式输入函数scanf()
1.字符输入函数getchar()
getchar()函数的作用是从终端输入一个字符。getchar()函数没有参数,其一般形式为:
getchar()
函数的返回值就是从输入设备上得到的字符。
例2-11 输入单个字符。
在运行时,如果从键盘上输入字符t并按回车键,就会在屏幕上看到输出的字符t。
t (输入字符t后,按“回车”键,字符送到内存)
t (输出变量i的值t)
注意:
(1)getchar()函数需要交互输入,接收到输入字符之后才继续执行程序。getchar()函数一次只能接收一个字符,它得到的字符可以赋给一个字符型变量或整型变量,也可以不赋给任何变量而作为表达式的一部分。如上例中的第6、7行可用下面一行代替:
putchar(getchar());
因为getchar()的值是't',因此putchar(getchar())输出't'。也可用printf()函数输出:
printf("%c",getchar());
(2)连续使用getchar()函数时,要注意字符的输入形式 ,例如,执行如下程序段:
char i,j;
i=getchar();
j=getchar();
必须连续输入两个字符,中间不能有其他字符。
(3)函数getchar()和putchar()是C语言的标准库函数,如果在一个函数中要调用getchar()函数和putchar()函数,在该函数的前面(或本文件的开头)一定要加上编译预处理命令:
#include"stdio.h"或#include 〈stdio.h〉
2.格式输入函数scanf()
scanf()的使用格式为:
scanf(格式控制,参数1,参数2,…);
作用是接收用户从键盘上输入的数据,按照格式控制的要求进行类型转换,然后送到由对应参数指示的变量单元中去。例如:
scanf("a=%d,b=%f",&a,&b);
其中,格式控制的含义同printf()函数,作用是将输入的数据转换成所指定的输入格式;参数指明输入数据所要放置的地址,所以,出现在参数位置上的变量名前要加上&运算符,表示取变量地址,如上式中的&a,&b。每个格式说明对应一个参数,如上式中的“%d”对应参数&a,“%f”对应参数&b。
例2-12 用scanf()函数输入数据。
运行时按以下方式输入a、b、c的值:
20 65 234.896 (输入a、b、c的值)
20,A,234.895996 (输出a、b、c的值)
scanf()函数的作用是按照a、b、c在内存的地址将a、b、c的值存进去,如图2.7.1所示。变量a、b、c的地址是在编译连接阶段分配的。
图2.7.1
"%d%c%f"表示第一个数按十进制整数形式输入,第二个数按字符型(或整型)数据输入,第三个数按浮点型数据输入。输入数据时,在两个数据间用一个或多个空格隔开,也可用回车键、跳格键tab。如下面输入均合法:
①20 65 234.896
②20
65 234.896
③20(按tab键)65
234.896
用"%d%c%f"格式输入数据时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
20,65,234.896
表2.7.3列出了scanf()常用的格式字符及其作用。
表2.7.3 scanf()中常用的格式字符及其作用
在格式说明中,在%和上述格式字符间可以插入以下几种附加符号(修饰符)。如表2.7.4所示。
表2.7.4 scanf()中的附加格式说明符及其说明
使用scanf()函数时应注意的问题:
(1)scanf()函数中的参数形式是地址形式:&变量名(除数组或指针变量),而不是变量名。
(2)输入数据是在程序运行中输入,输入的数据个数和类型必须与格式说明符一一对应。
(3)格式控制中有普通字符时,必须照原样输入。例如:
scanf("a=%d,b=%d",&a,&b);
输入的形式是:a=32,b=28
(4)格式符之间若无普通字符,则:
①输入的数值型数据用空白符(空格、tab键或回车键)分隔,或指定数据输入的宽度,让系统自动按它截取所需数据,例如:
scanf("%d%d%d",&a,&b,&c);
输入:34 52 67 (而34,52,67为非法)
scanf("%4d%d",&a,&b);
输入:4567893
系统自动将前4位(即4567)赋给变量a ,剩下的数据(即893)赋给变量b。
②输入的 char型数据不必分隔,例如:
scanf("%c%c%c",&ch1,&ch2,&ch3);
要输入:abc
不能输入:a b c
因为字符型变量只能容纳一个字符,这时系统把第1个字符送给变量ch1,把第2个字符送给变量ch2,把第3个字符送给变量ch3。
③注意数值型数据与char型数据的混合输入,例如:
scanf("%d%d",&m.,&n);
scanf("%c",&ch);
错误输入:32 28
a
正确输入:32 28a
(5)浮点型数据输入时,域宽不能用m.n形式的附加说明,即输入时不能指定精度,例如:
scanf("%5.3f",&i);
是不合法的。
(6)如果在%后有一个“*”附加说明符,表示忽略它指定的列数,例如:
scanf("%3d %*4d %2d",&i,&j);
输入如下数据:
345 6789 45
将345赋给变量i,%*4d表示输入4位整数但不赋给任何变量,然后再输入2位整数45赋给变量j。也就是说,第2个数据6789被忽略。在利用现成的一批数据时,有时不需要其中某些数据,可用此方法将其忽略。
(7)为了减少不必要的输入量,除了逗号、分号、空格符以外,格式控制中尽量不要出现普通字符,也不要使用'\n' 、'\t'等转义字符。
常见的编程错误2.6
在表达式中使用变量之前忘记给所有的变量赋值。初值能够在定义变量时通过显式赋值语句或通过scanf()函数输入值来赋值。
在scanf()函数调用中忘记在变量名的前面使用地址运算符&。
在scanf()函数调用中没有包含必须输入的数据值的正确控制字符串。
同一表达式多次出现的变量使用自增和自减运算符。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。