scanf函数详解(摘自CPrimer第六版中文版第四章)

4.4.5 使用 scanf ()

刚学完输出,接下来我们转至输入—— 学习 scanf ( ) 函数。C 库包含了多个输入函数, scanf ()是最通用的一个, 因为它可以读取不同格式的数据。当然, 从键盘输入的都是文本,因为键盘只能生成文本字符: 字母、数字和标点符号。如果要输入整数 2014 , 就要键入字符 2、0、1 、4。如果要将其储存为数值而不是字符串, 程序就必须把字符依次转换成数值, 这就是 scanf ()要做的。scanf ()把输入的字符串转换成整数、浮点数、字符或字符串, 而 printf ()正好与它相反,把整数、浮点数、字符和字符串转换成显示在屏幕上的文本。

scanf ( )和 printf ( ) 类似, 也使用格式字符串和参数列表。scanf ()中的格式字符串表明字符输入流的目标数据类型。两个函数主要的区别在参数列表中。printf ( ) 函数使用变量、常量和表达式,而 scanf ( )函数使用指向变量的指针。这里, 读者不必了解如何使用指针,只需记住以下两条简单的规则:


如果用 scanf ( ) 读取基本变量类型的值, 在变量名前加上一个&;
• 如果用 scanf ( )把字符串读入字符数组中, 不要使用&。( 对于字符串数组或字符串指针变量,由于数组名可以转换为数组和指针变量名本身就是地址,因此使用scanf()函数时,不需要在      它们前面加上"&"操作符。)

程序清单 4.15 中的小程序演示了这两条规则。

程序清单 4.15      input.c 程序

#include <stdio.h>

int main(void)
{
    int age;
    float assets;
    char pet[30];
    printf("Enter your age(年龄),ssets(资产),and favorite pet(宠物名) . \n");
    scanf("%d %f",&age,&assets);
    scanf("%s",pet);
    printf("%d $%.2f %s \n",age,assets,pet);

    return 0;
}

 

下面是该程序与用户交互的示例:

Enter your age , as ssets , and favorite pet .
38
92360.88 llama
38 $92360. 88 llama
scanf ()函数使用空白(换行符、制表符和空格)把输入分成多个字段。在依次把转换说明和字段匹配时跳过空白。注意, 上面示例的输入项(粗体部分是用户的输入)分成了两行。只要在每个输入项之间输入至少一个换行符、空格或制表符即可, 可以在一行或多行输入:

Enter your age, assets , and favorite pet.

42

2121.45

guppy

42   $2121.45  guppy

(上面这种输入方式演示了:当你用一条scanf()函数语句输入多个变量时,每输入完一个变量,只需要输入换行符、制表符和空格这三个键中的任意一个,编译器即认为你结束了一个变量的输入。当然,结束所有变量的输入,必须用回车键来告知编译器。)
唯一例外的是%c转换说明。根据% c , scanf ()会读取每个字符, 包 括空白。我们稍后详述这部分。
scanf ( )函数所用的转换说明与 printf ( )函数几乎相同。主要的区别是,对于 float类型和double类型 ,printf () 都使用 %f、%e、%E、%g、%G 转换说明。而 scanf( )只把它们用于 float 类型,对 于 double类型时要使用 l 修饰符。表 4.6 列出了 C99 标准中常用的转换说明。

 

                                                                     表 4.6 ANSIC 中 scanf( ) 的转换说明

 


3. scanf ( )的返回值
scanf ()函数返回成功读取的项数。如果没有读取任何项, 且需要读取一个数字而用户却输入一个非数值字符串, scanf( )便返回 0。当 fcanf( )检测到“文件结尾” 时, 会返回EOF ( EOF 是tdio.h 中定义的特殊值, 通常用#define 指令把 EOF 定义为- 1 ) 。我们将在第 6 章中讨论文件结尾的相关内容以及如何利用 scanf( )的返回值。在读者学会 if 语句和 while语句后, 便可使用 scanf()的返回值来检测和处理不匹配的输入。

这里,我们可以用一个小例子来体会一下这个特性:

#include <stdio.h>

int main(void)
{
    int num;
    int age;
    float assets;
    char pet[30];
    printf("Enter your age(年龄),ssets(资产),and favorite pet(宠物名) . \n");
    num=scanf("%d %f %s",&age,&assets,pet); //用num接收scanf函数返回值
    printf("scanf函数接受了%d个变量\n",num);
    printf("%d $%.2f %s \n",age,assets,pet);

    return 0;
}

当然,CPrimer这本书博大精深,关于scanf()函数的内容远不止这些。但是,scanf()函数过于古老了,有些编译器都不用它了。书中的有些知识也过于冷僻,所以,暂且摘抄到这里了。如果以后发现一些有价值的内容,再补充。

posted @ 2019-05-26 19:46  大老菜  阅读(837)  评论(0编辑  收藏  举报