【问题追踪】scanf引发的“血案”

最近我遇到C语言学习中一个比较容易让我们这种新手犯错或者忽略的地方。那就是关于scanf函数在读取字符时的问题,以及getchar()与回车的一点恩恩怨怨,换句话说也就是什么时候应该加getchar()吃掉回车。

直接上例子:

#include <stdio.h>
#include<stdlib.h>

int main()
{
    char operation;
    int num_1, num_2, sum;

    printf("请输入一个数字:\n");
    scanf("%d",&num_1);、//注释: 可以在这里加一个getchar(); 先不告诉你 往下看完就明白了。

    printf("请输入(+ - * /)\n");
    scanf("%c",&operation);

    printf("请输入第二个数字\n");
    scanf("%d",&num_2);

switch(operation)
{
    case '+':sum = num_1 + num_2;break;
    case '-':sum = num_1 - num_2;break;
    case '*':sum = num_1 * num_2;break;
    case '/':sum = num_1 / num_2;break;

    default:printf("你输入的操作符不正确请重新输入");break;
}
    printf("%d",sum);
    system("pause");
    return 0;
}

输出结果是:输入1 "回车"然后再输入‘+' 然后再按“回车” 程序直接中断了~

如下图:

回车后还没有来得及输入被加数,结果悲剧出现:

这是什么原因勒? 我也着实郁闷了好久,后来经过各位前辈们的指点慢慢的 我开始了解了getchar()这个函数的运用。

首先我们来慢慢回忆分析上面的例子: 当我们输入1 然后按“回车” 1被输出在屏幕上 但是“回车”却留在了缓冲区 然后我们又输入“+“ 按回车 这时候程序会直接读取缓冲区的残留数据(“回车”)而不会读取“+” 所以程序会中断! 也就是说我们需要一个函数来帮忙吃掉这个“回车” 那就是我们的getchar()函数.下面我们来改改例子!我们需要在什么时候吃掉这个缓冲区的回车勒?

那就是输入操作符加减乘除的时候 。不信你们可以在输入第一个数字后加一个getchar();函数,如下:

//...
printf("请输入一个数字:\n");
scanf("%d",&num_1);

getchar(); //注释: 可以在这里加一个getchar();
printf("请输入(+ - * /)\n");
scanf("%c",&operation);
//...

现在,程序就能正常运行了,虽然这个程序仍然还不是完美的,但是知道他的问题所就有很多解决办法了。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-08-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张戈的专栏

grep无法查找shell传过来的变量?先注意一下文本格式吧!

昨天,同事告诉我发现一个诡异的问题,grep 无法搜索 shell 中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行! 大概就是这样一个要求: ①、有...

3469
来自专栏大内老A

Enterprise Library深入解析与灵活应用(5):创建一个简易版的批处理执行器,认识Enterprise Library典型的配置方式和对象创建方式

最近负责一个框架性项目的升级,主要是从.NET Framework 3.0建议到.NET .NET Framework 3.5,开发工具也从VS2005迁移到V...

19310
来自专栏维C果糖

史上最简单的 MySQL 教程(三十)「联合查询」

联合查询:union,将多次查询(多条select语句)的结果,在字段数相同的情况下,在记录的层次上进行拼接。

3389
来自专栏开发 & 算法杂谈

Linux常用shell语法和命令

判断/home/oicq/script/get_random_shm_key.sh是否存在

742
来自专栏王硕

原 利用系统缓存提高PostgreSQL操作效率

3125
来自专栏逸鹏说道

sql server实现自定义分割月功能

本文目录列表: 1、为何出现自定义分割月需求 2、sql server实现自定义分割月功能 3、测试验证效果 4、总结语 5、参考清单列表 1、为何出现自定义分...

3276
来自专栏LanceToBigData

MySQL(九)之数据表的查询详解(SELECT语法)二

上一篇讲了比较简单的单表查询以及MySQL的组函数,这一篇给大家分享一点比较难得知识了,关于多表查询,子查询,左连接,外连接等等。希望大家能都得到帮助! 在开始...

18810
来自专栏大数据和云计算技术

hdfs auditlog(审计日志)

hdfs审计日志(Auditlog)记录了用户针对hdfs的所有操作,详细信息包括操作成功与否、用户名称、客户机地址、操作命令、操作的目录等。对于用户的每一个...

713
来自专栏IMWeb前端团队

Nodejs基础:路径处理模块path总结

模块概览 在nodejs中,path是个使用频率很高,但却让人又爱又恨的模块。部分因为文档说的不够清晰,部分因为接口的平台差异性。 将path的接口按照用途归类...

1795
来自专栏北京马哥教育

经典!Python运维中常用的几十个Python运维脚本

file是一个类,使用file('file_name', 'r+')这种方式打开文件,返回一个file对象,以写模式打开文件不存在则会被创建。但是更推荐使用内置...

844

扫码关注云+社区