14-输入流和数字
8.6.2 输入流和数字
在编写处理错误输入的代码时(如程序清单8.7),应该很清楚C是如何处理输入的。考虑下面的输入:
is 28 12.4
在我们眼中,这就像是一个由字符、整数和浮点数组成的字符串。但是对C程序而言,这是一个字节流。第1个字节是字母 i 的字符编码,第2个字节是字母 s 的字符编码,第3个字节是空格字符的字符编码,第4个字节是数字 2 的字符编码,等等。所以,如果 get_long() 函数处理这一行输入,第1个字符是非数字,那么整行输入都会被丢弃,包括其中的数字,因为这些数字只是该输入行中的其他字符:
while ((ch = getchar()) != '\n')
putchar(ch); // 处理错误的输入
虽然输入流由字符组成,但是也可以设置 scanf() 函数把它们转换成数值。例如,考虑下面的输入:
42
如果在 scanf() 函数中使用 %c 转换说明,它只会读取字符 4 并将其存储在 char 类型的变量中。如果使用 %s 转换说明,它会读取字符 4 和字符 2 这两个字符,并将其存储在字符数组中。如果使用 %d 转换说明, scanf() 同样会读取两个字符,但是随后会计算出它们对应的整数值: 4 × 10+2 ,即 42 ,然后将表示该整数的二进制数存储在 int 类型的变量中。如果使用 %f 转换说明, scanf() 也会读取两个字符,计算出它们对应的数值 42.0 ,用内部的浮点表示法表示该值,并将结果存储在 float 类型的变量中。
简而言之,输入由字符组成,但是 scanf() 可以把输入转换成整数值或浮点数值。使用转换说明(如 %d 或 %f )限制了可接受输入的字符类型,而 getchar() 和使用 %c 的 scanf() 接受所有的字符。