scanf()函数慎重使用

    在一般的 C 入门书籍中介绍输入输出函数时,总是会拿scanf和printf函数来举例。这里主要说下scanf函数的一些事情。

1. 头文件

    scanf与printf函数一样,都被定义在头文件stdio.h里,因此在使用scanf函数时要加上

#include <stdio.h>。

2. 函数原型

int scanf(const char *format,...);

    函数 scanf() 是从标准输入流stdio (标准输入设备,一般是键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

3. 返回值

    scanf()函数返回成功赋值的数据项数,读到文件末尾出错时则返回EOF。如

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

如果a和b都被成功读入,那么返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。

为什么要慎用scanf()呢?

    首先,是输入格式要求高。在输入流中,数据项必须由空格制表符新行符分割。逗号和分号等不是分隔符,比如上面的代码,将接受输入5 10,但输入5,10则失败。

    其次,scanf()自身实现的问题。scanf()不是以行单位对输入内容进行解释,而是对连续字符流进行解释(换行字符也视为一个字符)。scanf()连续地从流读入字符,并且对和格式说明符(%d)相匹配的部分进行变换处理。例如,当格式说明符为%d 的时候,输入

123(回车)

    scanf()函数从流中取得 123 部分的内容,并对它进行处理。换行符依旧会残留在流中。因此,在C代码中需要使用一个后续的 getchar()来吞食这个留下的换行符。

    scanf()在读入过程中有几个对象被成功地变换,则 scanf()的返回值就为几。如果做一下错误检查,可能有人会写出下面的代码:

while (scanf("%d", &hoge) != 1)
{
   printf("输入错误,请再次输入!");
}

    分析一下上面的代码,我们就会知道,一旦用户错误输入过一次,这段程序就会进入无限循环。原因就是:错误输入的那部分字符串,将会被下一个 scanf()读到。

替代scanf的方法

    使用fgets()和 sscanf()组合方式来进行替代。如下:

int         hoge;
char        buf[256];

fgets(buf, sizeof(buf), stdin);
sscanf(buf, "%d", &hoge);

    替代之后,在用户输入的一串字符中,匹配第一个遇到的整数,赋值给hoge。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值