#include <stdio.h>
int main(void)
{
int i;
scanf("%d", &i);
printf("i = %d\n", i);
return 0;
}
在 VC++ 6.0 中的输出结果是:
a
i = -858993460
输出 –858993460 表示变量未初始化。为什么输入 a,变量 i 却显示未初始化呢?
在 scanf 中,从键盘输入的一切数据,不管是数字、字母,还是空格、回车、Tab 等字符,都会被当作数据存入缓冲区。存储的顺序是先输入的排前面,后输入的依次往后排。按回车键的时候 scanf 开始进入缓冲区取数据,从前往后依次取。
但 scanf 中 %d 只识别“十进制整数”。对 %d 而言,空格、回车、Tab 键都是区分数据与数据的分隔符。当 scanf 进入缓冲区中取数据的时候,如果 %d 遇到空格、回车、Tab 键,那么它并不取用,而是跳过继续往后取后面的数据,直到取到“十进制整数”为止。对于被跳过和取出的数据,系统会将它从缓冲区中释放掉。未被跳过或取出的数据,系统会将它一直放在缓冲区中,直到下一个 scanf 来获取。
但是如果 %d 遇到字母,那么它不会跳过也不会取用,而是直接从缓冲区跳出。所以上面这个程序,虽然 scanf 进入缓冲区了,但用户输入的是字母 a,所以它什么都没取到就出来了,而变量 i 没有值,即未初始化,所以输出就是 –858993460。
但如果将 %d 换成 %c,那么任何数据都会被当作一个字符,不管是数字还是空格、回车、Tab 键它都会取回。
不但如此,前面讲过,你从键盘输入 123,这个不是数字 123,而是字符 '1'、字符 '2' 和字符 '3',它们依次排列在缓冲区中。因为每个字符变量 char 只能放一个字符。所以输入“123”之后按回车,scanf 开始进入缓冲区,按照次序,先取字符 '1',如果还要取就再取字符 '2',以此类推。
如果都取完了还有 scanf 要取数据,那么用户就需要再输入。先写一个程序看一下:
#include<stdio.h>
int main(void)
{
char i, j, k;
scanf("%c%c%c", &i, &j, &k);
printf("i = %c, j = %c, k = %c\n", i, j, k);
return 0;
}
在 VC++ 6.0 中的输出结果是:
123
i = 1, j = 2, k = 3