初识Scanf
功能概况:通过键盘给程序中的变量赋值。
格式如下:
int scanf(const char *format, ...);
具体用法
scanf("输入控制符", 输入参数);功能:将从键盘输入的字符转化为“输入控制符”所规定格式的数据,然后存入以输入参数的值为地址的变量中。
# include <stdio.h> int main(void) { int i; scanf("%d", &i); //&i 表示变量 i 的地址,&是取地址符 printf("i = %d\n", i); return 0; }
“输入控制符”和“输出控制符”是一模一样的。比如一个整型数据,通过 printf 输出时用%d输出,通过 scanf 输入时同样是用%d。
我们从键盘输入的全部都是字符。比如从键盘输入 123,它表示的并不是数字 123,而是字符 '1'、字符 '2' 和字符 '3'。
操作系统在接收键盘数据时都将它当成字符来接收的。这时就需要用“输入控制符”将它转化一下。%d的含义就是要将从键盘输入的这些合法的字符转化成一个十进制数字。经过 %d 转化完之后,字符 123 就是数字 123 了。&是一个取地址运算符,&后面加变量名表示“该变量的地址”,所以&i就表示变量 i 的地址。&i又称为“取地址i”,就相当于将数据存入以变量 i 的地址为地址的变量中(就是变量 i)。
scanf("输入控制符非输入控制符", 输入参数);例子如下
# include <stdio.h> int main(void) { int i; scanf("i = %d", &i); printf("i = %d\n", i); return 0; }
在 printf 中,所有的“非输出控制符”都要原样输出。同样,在 scanf 中,所有的“非输入控制符”都要原样输入。所以在输入的时候i=必须要原样输入。比如要从键盘给变量 i 赋值 123,那么必须要输入i=123才正确,少一个都不行,否则就是错误。
一次给多个变量赋值:
# include <stdio.h> int main(void) { int i, j; scanf("%d%d", &i, &j); printf("i = %d, j = %d\n", i, j); return 0; }
首先,scanf 中双引号内除了“输入控制符”之外不要加任何“非输入控制符”。通过键盘给多个变量赋值与给一个变量赋值其实是一样的。比如给两个变量赋值就写两个 %d,然后“输入参数”中对应写上两个“取地址变量”;给三个变量赋值就写三个 %d,然后“输入参数”中对应写上三个“取地址变量”……
虽然 scanf 中没有加任何“非输入控制符”,但是从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键隔开,用以区分是给不同变量赋的值。而且空格、回车或 Tab 键的数量不限,只要有就行。一般都使用一个空格。
有些人觉得在输入的时候可以用逗号分隔,所以就在“输入控制符”之间用逗号隔开。这样做从程序的角度确实是可以的,但是建议大家不要这样做,原因有如下两个:
首先逗号要原样输入的,有几个就要输入几个,少一个或多一个都不行;其次,也是最主要的原因就是输入法的问题,在 scanf 中是在英文输入法下写的逗号,那么输入的时候如果是中文输入法下的逗号那也是错的。所以用逗号很容易出错。scanf的注意事项
1.参数的个数一定要对应
在前面介绍 printf 时说过,“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。这句话同样对 scanf 有效,即“输入控制符”和“输入参数”无论在“顺序上”还是在“个数上”一定要一一对应。比如:
# include <stdio.h> int main(void) { char ch; int i; scanf("%c%d", &ch); printf("ch = %c, i = %d\n", ch, i); return 0; }
a 6 ch = a, i = -858993460
程序中为什么 i=–858993460?当变量没有初始化的时候就会输出这个值。
从键盘输入的数据都会先存放在内存中的一个缓冲区。只有按回车键后 scanf 才会进入这个缓冲区和取数据,所取数据的个数取决于 scanf 中“输入参数”的个数。所以上述程序中 scanf 只有一个输入参数,因此按回车键后 scanf 只会取一个数据。所以变量 ch 有数据,而变量 i 没有数据,没有数据就是没有初始化,输出就是 –858993460。
2.输入的数据类型一定要与所需要的数据类型一致
3.在使用 scanf 之前使用 printf 提示输入
使用建议小结
scanf 的使用看似细节繁杂,但使用起来非常简单。就目前而言,只要掌握以下五点:
在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记。scanf 中双引号内,除了“输入控制符”外什么都不要写。“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。“输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理,这个稍后再讲。使用 scanf 之前先用 printf 提示输入。