zoukankan      html  css  js  c++  java
  • 调用scanf函数的一个陷阱

    我们在写C程序时,经常使用scanf函数,让用户输入数据,可是有时候会出现一些很奇怪的问题。例如,下面的程序是一个简单的四则运算:

    #include <stdio.h>
    
    int main()
    {
    char ope = '';//操作符+ - * /
    int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果
    
    printf("请输入第一个运算参数
    ");
    scanf("%d",¶1);
    printf("请输入运算符 '+ - * /'
    ");
    scanf("%c",&ope);
    printf("请输入第二个运算参数
    ");
    scanf("%d",¶2);
    switch(ope)
    {
    case '+': result = para1 + para2;//如果运算符是+,就执行加法运算
    break;
    case '-': result = para1 - para2;//如果运算符是-,就执行减法运算
    break;
    case '*': result = para1 * para2;//如果运算符是*,就执行乘法运算
    break;
    case '/': result = para1 / para2;//如果运算符是/,就执行除法运算
    break;
    default: printf("运算符输入错误
    ");//
    break;
    }
    printf("运算结果是: %d
    ", result);
    return 0;    
    }

    此程序不管从语法,还是逻辑上,都没有问题,且编译也能通过。实际运行时,却是如下结果:


    在用户输入第一个运算参数后,按照程序的设定,应该让用户输入运算符,可是直接让用户输入第二个运算参数了。你能看出这是为什么吗? 
    我们修改下程序,如下:

    #include <stdio.h>
    
    int main()
    {
    char ope = '';//操作符+ - * /
    int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果
    
    printf("请输入第一个运算参数
    ");
    scanf("%d",¶1);
    printf("请输入运算符 '+ - * /'
    ");
    scanf("%c",&ope);
    
    printf("运算符是: %d
    ", ope);
    printf("请输入第二个运算参数
    ");
    scanf("%d",¶2);//加入这两行代码
    switch(ope)
    {
    case '+': result = para1 + para2;//如果运算符是+,就执行加法运算
    break;
    case '-': result = para1 - para2;//如果运算符是-,就执行减法运算
    break;
    case '*': result = para1 * para2;//如果运算符是*,就执行乘法运算
    break;
    case '/': result = para1 / para2;//如果运算符是/,就执行除法运算
    break;
    default: printf("运算符输入错误
    ");//
    break;
    }
    printf("运算结果是: %d
    ", result);
    return 0;    
    }

    我们加入两行代码,输出字符参数ope的ASCII码值,结果如下:


    可以看到,ope的ASCII码值是10,正是换行符的ASCII码值。我们什么时候把换行符给了ope?
    其实,在我们给运算参数para1赋值1的时候,我们按下了回车键,准备输入运算符,可是系统不懂啊,系统把回车键理解为换行符赋值给了ope,所以接下来会跳过让用户输入运算符而直接让用户输入运算参数2了,问题就在这里。

    知道了问题所在,那么就好解决了。 请看:

    #include <stdio.h>
    #include <conio.h>
    
    int main()
    {
    char ope = '';//操作符+ - * /
    int para1 = 0, para2 = 0, result = 0;//para1是运算参数1,para2是运算参数2,result是运算结果
    
    printf("请输入第一个运算参数
    ");
    scanf("%d",¶1);
    getchar();
    
    printf("请输入运算符 '+ - * /'
    ");
    scanf("%c",&ope);
    getchar();
    printf("运算符是: %d
    ", ope);
    printf("请输入第二个运算参数
    ");
    scanf("%d",¶2);
    switch(ope)
    {
    case '+': result = para1 + para2;//如果运算符是+,就执行加法运算
    break;
    case '-': result = para1 - para2;//如果运算符是-,就执行减法运算
    break;
    case '*': result = para1 * para2;//如果运算符是*,就执行乘法运算
    break;
    case '/': result = para1 / para2;//如果运算符是/,就执行除法运算
    break;
    default: printf("运算符输入错误
    ");//
    break;
    }
    printf("运算结果是: %d
    ", result);
    return 0;    
    }

    在每次scanf结束后,加入getchar函数,即可。getchar函数从输入流中读取一个字符,因此可以接收我们每次按下的回车键,也就是换行符。运行结果如下:




  • 相关阅读:
    DevOps的基本原则与介绍
    微信和WeChat的合并月活跃账户达6.97亿
    dedecms手机站图片错误的解决方法
    可以搜索到DedeCms后台文章列表文档id吗?或者快速定位id编辑文章
    Slyce,这家硅谷创业公司的来头你知道吗
    一个canonical标签解决site不在首页的问题
    通过html<map>标签给图片加链接
    解决后台无法进入提示DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value
    六小龄童终究还是没能上春晚
    excel同时冻结首行和首列怎么操作
  • 原文地址:https://www.cnblogs.com/itblog/p/7236566.html
Copyright © 2011-2022 走看看