【问题追踪】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 条评论
登录 后参与评论

相关文章

来自专栏Crossin的编程教室

如何在 Python 中使用断点调试

实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。 -- 林纳斯·托瓦兹(Linux 之父) 既然不是神,写代码自然免不了要修改。修改代码的过程被...

2486
来自专栏Django中文社区

简单全文搜索

搜索是一个复杂的功能,但对于一些简单的搜索任务,我们可以使用 Django Model 层提供的一些内置方法来完成。现在我们来为我们的博客提供一个简单的搜索功能...

2796
来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-TODO LIST

课程内容 ØPivot控件 ØContext Menu ØData Contract Attributes     TODO List使得我们能够快速、简单并...

1596
来自专栏自然语言处理

数据分析:基于Python的自定义文件格式转换系统

       无论读者现在是做数据挖掘、数据分析、自然语言处理、智能对话系统、商品推荐系统等等,都不可避免的涉及语料的问题即大数据。数据来源无非分为结构化数据、...

1255
来自专栏枕边书

搭建自己的PHP框架心得(一)

前言 说到写PHP的MVC框架,大家想到的第一个词--“造轮子”,是的,一个还没有深厚功力的程序员,写出的PHP框架肯定不如那些出自大神们之手、经过时间和各种项...

2027
来自专栏Google Dart

AngularDart4.0 英雄之旅-教程-03英雄编辑器

码云项目页:https://gitee.com/scooplolwiki/toh-1

411
来自专栏张善友的专栏

The jQuery UI CSS Framework

jQuery UI是 jquery官方推出的配合jquery使用的用户界面组件集合!包含了许多的界面操作功能,如我们常用的表格排序,拖拽,TAB选项卡,滚动条,...

1766
来自专栏iKcamp

微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联

§ 视图与数据关联 本文配套视频地址: https://v.qq.com/x/page/z0554wyswib.html 开始前请把 ch3-3 分支...

16410
来自专栏大数据钻研

如何编写简练清晰的HTML代码?

如何提升 Web 页面的性能,很多开发人员从多个方面来下手如 JavaScript、图像优化、服务器配置,文件压缩或是调整 CSS。 很显然 HTML 已经达到...

3346
来自专栏月牙寂

k8s源码分析------kube-apiserver分析(3)

第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

4288

扫描关注云+社区