
3.3 数据输入
3.3.1 格式输入函数scanf
scanf是一个很常用的格式输入函数,它的作用是从键盘读入字符序列,并按格式控制字符串所指明的格式进行转换,把相应的转换代码存储在指定的变量之中。
其调用格式为:

格式控制串的意义和printf函数中的格式控制字符非常类似,如表3-3所示。
表3-3 格式控制字符一览表

注意:在scanf函数中列出的是接受数据的变量的地址,而非变量本身。例如:

和printf函数相似,格式说明时,在“%”和格式控制符之间还可以插入几种附加说明符,如表3-4所示。
表3-4 附加说明符

关于scanf函数在使用时应该注意以下几点:
(1)如果格式控制符中说明符紧紧地连在一起,即格式说明符之间无其他任何字符,如用“%d%d%d”输入整数时,则输入时应注意两个数据之间用一个空格或多个空格(tab键、回车键)分开。除了这几种键以外,不能加入其他字符。
但是,如果格式控制串中有其他字符时,则输入时应该严格按照格式控制串中把规定的形式输入。例如:

则输入时应键入:

这里,在输入x的值23前一定要先输入“x:”,之后一定要输入逗号“,”,然后键入“y:”后才能输入y的值50,否则输入的数据就可能出错。
一般在输入数据时,凡是遇到空格、回车键或tab键均被认为一个数据的结束。
(2)和printf函数的格式说明符不同的是,scanf有格式说明符“%*”,它表示跳过它所对应的数据。例如:

当键入:5.23 5.12 2.3545 523.651时,可得:

而5.12,2.3545这两个数被跳过,没有读入。
(3)在输入时,还可以在格式说明符中指定输入数据中有多少列,计算机会按所指定的长度自动截取数据。例如:

如果输入:123456
然而结果x=12,其余的数字被丢掉。
当用scanf输入实数时不能指定输入小数点后多少位。例如:

这句是错误的,事实上系统确实无法保证输入的实数一定精确到小数点后面两位。因为输入数据的精度取决于数据的提供者,计算机是无能为力的。
(4)使用scanf函数时最容易犯的错误,是忘记在接受数据的变量名前面加上符号“&”。这一点尤其要牢记,scanf函数中使用的是变量的地址而非变量名。
不要写成:

而要写成:

3.3.2 字符输入函数getchar
该函数格式为:getchar(),没有参数。作用是从标准输入终端(键盘)的字符流中取下一个输入字符,并返回该字符的ASCII码。
一般应先定义一个字符型变量,然后用getchar函数得到这个字符,并将该字符赋给字符变量。
例如:


如果从键盘上输入一个字符'R',则会在屏幕上显示R。