scanf()函数用法完全攻略

printf( ) 函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息,即把数据发送到屏幕(见图 1)。

printf( ) 函数把字符、数字、字符串以及变量的值发送到屏幕上
图 1:printf( ) 函数把字符、数字、字符串以及变量的值发送到屏幕上

而 scanf( ) 函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息并存储在变量中(见图 2 )。
 
scanf( ) 函数把用户通过键盘输入的值存储到变量中
图 2:scanf( ) 函数把用户通过键盘输入的值存储到变量中

程序在运行过程中,必须得有一种方法从程序外部获得数据,并存储在某个变量中,不能总是使用赋值语句进行赋值。

例如,你编写一个 C 程序用于管理全班学生的考试成绩,你就不能在程序中用=把所有同学的成绩都赋值给变量,因为每次考试成绩都会不同,而且不同的班级考试成绩也不相同。你需要在程序运行开始阶段提供一个功能,用于实时输入学生的考试成绩。使用 scanf( ) 就可以实现这个功能。
scanf("格式控制字符串",变量地址表列);                  //变量地址编列各项用逗号隔开

如果你掌握了用 printf( ) 把变量的值发送到屏幕,那么 scanf( ) 就很简单了。scanf( ) 的书写格式看起来和 printf( ) 很像,他们都用到了转化字符如 %d 和 %s 等,例如:
printf("%d %f %c %s",Int,Float,Char,String);             //向屏幕输出值
scanf("%d %f %c %s",&Int,&Float,&Char,String);    //从键盘获取值

两者的不同之处在于 scanf( ) 中所有变量名前面必须加上& 符号(字符串数组名前面不用加),尽管&符号并不是变量名的一部分。只有变量前面加了&符号,scanf( ) 才能把从键盘获取到的数据正确存储到对应的变量中。

实际上,&符号在 C语言中是取址符,&Int 就是变量 Int 在内存中的地址。scanf( ) 就是根据变量在内存中的地址把从键盘获取到的数据存储在变量中的,就如同快递员根据收件人的地址把包裹准确的投送到收件人手上一样。而字符串数组是由多个数组元素变量组成的,数组名本身就对应于一个内存地址,所以 scanf( ) 中的字符串数组名前面不用加&符号。

scanf( ) 和 printf( ) 一样,在使用它们的 C 程序中,必须在程序的预处理指令部分添加指令包含 stdio.h 头文件:#include<stdio.h>

scanf( ) 格式控制字符串中转化字符的一般形式为:
%[数据宽度][数据长度]数据类型字符      //[ ]为可选项 

1) 数据类型字符:用于表示输入数据的类型,表 1 列出了其格式字符和意义。

表 1:C语言中 scanf( ) 函数控制输入数据类型的格式字符
格式字符 输出示例 意义
d scanf("%d",&Int);     输入十进制整数
u scanf("%u",&Int); 输入无符号十进制整数
o scanf("%o",&Int0); 输入八进制整数
x scanf("%x",&Int0x); 输入十六进制整数
f scanf("%f",&Float); 输入小数形式的实数
e scanf("%e",&Float); 输入指数形式的实数
c scanf("%c",&Char); 输入单个字符
s scanf("%s",String); 输入字符串

2) 数据宽度:用十进制整数指定输入数据的宽度(即字符数),若输入字符数超出指定值,超出部分被截去。例如:scanf("%5f",&Pi);  输入3.1415925,scanf( ) 只是把 3.141 这 5 个字符存储在了变量中,其余部分被截去。即用printf("%f",Pi);显示变量 Pi 的值为3.141000。

3) 数据长度:长度格式符有 l 和 h 两种。l 表示输入长整型数(如 %ld )或双精度浮点数(如 %lf )。h 表示输入短整型数或单精度浮点数。
C 程序中通常要在scanf( )语句前面添加printf( )语句,用于在屏幕上输出提示信息,提示用户输入什么样的数据值。
使用scanf( )函数必须注意以下几点:

1) scanf( )函数没有精度控制。如:
scanf("%.2f",&Pi);
是非法的格式控制字符串,不能企图用此语句输入小数位数为 2 的实数。

2) scanf( ) 函数要求给出所有变量的地址,即变量名前加&符号(字符串数组名前不用加)。如:
scanf("%d %f %c %s",&Int,&Pi,&Char,String);
输入893.14 X China,回车后这 4 个数据会分别被存储进变量 Int、Pi、Char 和数组 String 中。
在用键盘输入多个数值时,若格式控制字符串中没有指定分隔符,则可用空格、Tab 键或回车键来做间隔,全部输入后用回车结束。
3) 在输入字符数据时,若格式控制字符串中没有指定分隔符,则所有输入的字符均为有效字符(包括空格)。如:
scanf("%c%c%c%c%c",&a&b&c&d&e);
输入Mr smith,scanf( ) 会把 M 存储在变量 a 中,r 存储在变量 b 中,空格存储在变量 c 中,s 存储在变量 d 中,m 存储在变量 e 中,剩余部分被截去。

4) 在输入字符串时,如果输入空格,则认为输入已结束。如:
scanf("%s",myName);
输入John Smith,scanf( ) 只把 John 存储在字符数组 myName 中,空格后的 Smith 被截去。

scanf( ) 函数输入格式化数据的实例如代码清单 1 所示。

代码清单 1:使用 scanf( ) 函数输入数据示例
#include <stdio.h>
#include <stdlib.h>
int main(){
    char Char_A,Char_B;
  printf("请输入两个字符,然后回车:\n");
  scanf("%c%c",&Char_A,&Char_B);
  printf("\n使用scanf()获取输入值以后:\n");
  printf("变量Char_A的值为:%c\n",Char_A);   
  printf("变量Char_B的值为:%c\n",Char_B);
  system("pause");
  return 0;
}
转化字符之间没有空格,输入的所有字符都将是有效字符,包括空格。
运行结果:

请输入两个字符,然后回车:
M N

使用scanf()获取输入值以后:
变量Char_A的值为:M 变量Char_B的值为:

scanf( ) 的格式控制字符串中多个转化字符之间最好用空格分隔。
scanf( ) 函数与 printf( ) 函数配合使用的实例如代码清单 2 所示。

代码清单 2:scanf( ) 函数与 printf( ) 函数一起使用示例
#include <stdio.h>
#include <stdlib.h>
int main(){
  int age;
  float weight;
  char Name[15];
  printf("请输入您的姓名:");
   scanf("%s",Name);
  printf("请输入您的年龄:");
  scanf("%d",&age);
  printf("请输入您的体重(公斤):");
  scanf("%f",&weight);
  printf("\n以下是您输入的个人信息:\n");
  printf("姓名:%s\n",Name);
  printf("年龄:%d\n",age);
  printf("体重:%.2f公斤\n",weight);
  system("pause");
  return 0;
}
程序运行到scanf( )后,暂停运行,等待用户输入数据;用户输入数据后继续运行下面的语句。
运行结果:

请输入您的姓名:lyy
请输入您的年龄:25
输入您的体重(公斤):48

以下是您输入的个人信息:
姓名:lyy
年龄:25
体重:48.00公斤