C编程从入门到实践
上QQ阅读APP看书,第一时间看更新

6.2.4 scanf函数

函数scanf又称为格式输入函数,能够按用户指定的格式从键盘上把数据输入到指定的变量之中。

1.函数scanf的一般形式

函数scanf是一个标准的库函数,其函数原型包含在头文件“stdio.h”中。和函数printf相同,C语言也允许在使用函数scanf之前不必包含stdio.h文件。使用函数scanf的一般格式如下所示。

    scanf("格式控制字符串",地址列表);

其中,“格式控制字符串”的作用与函数printf的相同,但是不能显示非格式字符串,即不能显示提示的字符串。地址列表给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如下面的代码分别表示变量a和变量b的地址。

    &a, &b

上述地址就是编译系统在内存中给变量a、b分配的地址。在C语言中,地址的概念与其他语言是不同的,应该把变量值和变量地址这两个不同的概念区别开来。变量地址是由C编译系统分配的,用户不必关心具体的地址是多少。

例如在赋值表达式a=123中给变量赋值,则a为变量名,123是变量值,&a是变量a的地址。

在赋值符号左边是变量名,不能写地址。而函数scanf在本质上也是给变量赋值,但它要求写变量的地址,例如&a,这二者在形式上是不同的。单独一个&是一个取地址运算符,而&a是一个表达式,其功能是求变量的地址。

看下面的一段代码。

    int main(void){
        int a, b, c;
        printf("input a, b, c\n");
        scanf("%d%d%d", &a, &b, &c);
      printf("a=%d, b=%d, c=%d", a, b, c);
    }

在上述代码中,因为函数scanf本身不能显示提示字符,所以先用printf语句在屏幕上输出提示用户输入a、b、c的值。当执行scanf语句后,程序会退出Turbo C屏幕进入用户屏幕以等待用户输入。用户输入7 8 9后按下Enter键,此时系统又将返回Turbo C屏幕。在scanf函数的格式串中,因为没有非格式字符在“%d%d%d”之间作输入时的间隔,所以在输入时要用多个空格或Enter键作为两个输入数之间的间隔。

2.格式字符串

函数scanf的格式字符串和函数printf的类似,以%开头,以一个格式字符结束,中间可以插入附加的字符。函数scanf的格式如下所示。

    %[*][输入数据宽度][长度]格式字符

其中,方括号“[]”中的部分为可选项。在上述格式中各选项的具体说明如下所示。

❑ 格式字符。

格式字符用于标识输出数据的类型,各格式字符的具体说明如表6-3所示。

❑ “*”字符。

用以表示该输入项,读入后不赋值给相应的变量,即跳过该输入值。例如:

    scanf("%d %*d %d", &a, &b);

表6-3 格式字符的说明

当输入1、2、3时,会把1赋值给a,跳过2,3赋值给b。

❑ 宽度。

用十进制整数指定输入的宽度(即字符数)。例如:

    scanf("%5d", &a);

如果输入“12345678”,则会把12345赋值给变量a,截去其余部分。例如:

    scanf("%4d%4d", &a, &b);

如果输入“12345678”,则会把1234赋值给a,而把5678赋值给b。

❑ 长度。

长度格式符是l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf);而h则表示输入短整型数据。

在C语言中使用函数scanf时,必须注意以下6点。

(1)在函数scanf中没有精度控制,例如scanf("%5.2f",&a);是非法的。不能用此语句输入小数位数为两位的实数。

(2)scanf中要求给出变量地址,如给出变量名则会出错。例如scanf("%d",a);是非法的,应改为scanf("%d",&a);这才是合法的。

(3)在输入多个数据时,若格式控制字符串中没有使用非格式字符作为输入数据之间的间隔,则可用空格、制表符或回车符。在编译时如果遇到空格、Tab、Enter或非法数据(如对“%d”输入“12A”时,A即为非法数据),则认为该数据输入结束。

(4)在输入字符数据时,若格式控制字符串中无非格式字符,则认为所有输入的字符均为有效字符。例如:

    scanf("%c%c%c", &a, &b, &c);

如果输入d e f,则会把d赋值给a,把空格赋值给b,把e赋值给c。只有当输入为def时,才能把d赋值给a,把e赋值给b,把f赋值给c。如果在格式控制中加入空格作为间隔,例如,

    scanf ("%c %c %c", &a, &b, &c);

则输入时可在各数据之间加空格。

看下面的一段代码。

    int main(void){
        char a, b;
        printf("input character a, b\n");
        scanf("%c%c", &a, &b);
        printf("%c%c\n", a, b);
    }

在上述代码中,因为在scanf函数"%c%c"中没有空格,所以输入“M N”后,输出结果中只有M。而输入改为MN时才可以输出MN两个字符。

(5)如果格式控制字符串中有非格式字符,则输入时也要输入该非格式字符。例如:

    scanf("%d, %d, %d", &a, &b, &c);

其中,用非格式符“,”作为间隔符时,应为5、6、7。例如:

    scanf("a=%d, b=%d, c=%d", &a, &b, &c);

此时输入应该为a=5,b=6,c=7。

(6)如果输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。

看下面的一段代码。

    int main(){
          long a;
          printf("input a long integer\n");
          scanf("%ld", &a);
          printf("%ld", a);
    }

当输入一个长整型数值123456789后,输出的数据也是123456789,即输入和输出数据完全相等,如图6-6所示。

图6-6 执行效果

实例6-5

通过函数scanf输出用户输入字符的ASCII码和对应的大写字母

源码路径daima\6\6-5

本实例的实现文件为“scanf.c”,具体实现代码如下:

    int main(void)
  {
        char a, b, c;                  //声明3个字符变量
        printf("input lowercase a, b, c\n");
        scanf("%c, %c, %c", &a, &b, &c); //输入3个字母
        //输出3个字符以及它们的大写字母
        printf("%d, %d, %d\n%c, %c, %c\n", a, b, c, a-32, b
-32, c-32);
  }

拓展范例及视频二维码

范例6-5-01:演示文本的输入和输出

源码路径:演练范例\6-5-01\

范例6-5-02:使用scanf()函数

源码路径:演练范例\6-5-02\

上述代码的具体实现流程如下所示。

(1)定义3个字符型的变量a、b和c。

(2)通过printf输出提示,提示用户输入3个小写字母。

(3)通过scanf将用户输入的数据存储到指定的变量中。

(4)输出对应的3个大写字母和ASCII码。

程序运行后会在界面窗口中提示输入小写字母,例如输入m、n、z,按下Enter键后将分别输出输入字符m、n、z对应的ASCII码和对应的大写字母,如图6-7所示。

图6-7 执行效果