鱼C论坛

 找回密码
 立即注册
查看: 2822|回复: 4

[已解决]scanf(" %c",&ch)前面为啥要加空格

[复制链接]
发表于 2019-12-9 22:09:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
int main()
{
    double x;
    double sum=0;
    int z;//1自己加,2协助加
    char ch;//存放类型
    
    printf("请输入要加的量:");
    scanf("%lf",&x);
    
    printf("请输入要加的类型(A/B/C):");
    scanf(" %c",&ch);//如果这个前面没有空格的话,就会执行defalut 
    
    switch(ch)
    {
    case 'A':sum=5.75*x;break;
    case 'B':sum=6.00*x;break;
    case 'C':sum=7.15*x;break;
    default :printf("输入类型错误\n");
    }
    
    printf("请输入需要的服务(1/2):");
    scanf("%d",&z);
    
    if(z==1)
    printf("你要付的钱是%lf\n",sum*0.95);
    else
    printf("你要付的钱是%lf\n",sum*0.9);

    return 0;


}

/*scanf(" %c",&ch) ;
%c前面的空格就是用来屏蔽空白符的,但想要弄明白这个问题,必须要知道scanf的工作原理。 但在此之前,我们先介绍两个专业术语。

1、缓冲区
缓冲区是一块存放临时输入数据的内存,我们在键盘上输入数据之所以不会马上显示,就是因为数据存放在了缓冲区,在上面例子中,当我们按下回车键后,缓冲区的数据会传送到标准输入流。

2、标准输入流
标准输入流(stdin)是文件指针,scanf()就是从标准输入流获取数据。

以上面代码为例,当执行到scanf()时,开始等待用户输入,当我们输入数据,在按下回车键前会把数据储存在缓冲区,按下回车键后,会把数据以及换行符(\n)一起传送到标准输入流(stdin)中,scanf()就是从标准输入流中或许数据,上面第一个scanf()要读入一个整数,它从标准输入流中查找,跳过空白符(空格、换行符、制表符),如果遇到数字,则开始读入,直到遇到非数字的字符结束,最后计算读取到的数值,储存到相关变量中。

所以对于scanf()而言,%c是个较为特殊的说明符。 %c前没空格,scanf()将读取标准输入流中的第一个字符,%c前有空格,scanf()则读取标准输入流中第一个非空白字符。
*/
这是百度搜到的,但是看完就懵了啥时候就要加空格了,啥时候就不用加
最佳答案
2019-12-10 10:03:12
好好学习一下scanf函数的用法。
你的程序中第一个读取的是double类型变量,必须要以空白符(回车、空格、Tab)或者非数字符号(例如ABC、+-*等等)作为分隔符以说明double类型变量已经输入完成了,执行完第一个scanf语句后将会把读取到的double类型赋值给x,然而此时缓冲区中会剩下一个空白符或者去她类型的字符,空白符本身也是一个char类型变量,因此你的第二句scanf执行的时候,若%c之前没有空格,则会将那个空白符赋值给变量ch,那么就会出现你题中所述的现象。
我猜想一下你的程序执行过程:程序开始运行……然后你输入一个double(我们假设为1.5),然后回车,你再输入一个char字符(我们假设是B)……
当你输入1.5,再回车的时候,实际上程序吧1.5赋值给x,缓冲区会剩下一个空白符,当执行第二句scanf时,会把缓冲区的回车当做scanf语句中的空格,然后把B赋值给ch,程序顺利通过。若第二个scanf语句中%c之前没有空格,那么程序会把缓冲区的回车赋值给ch,根本不给你输入B的机会。。。。
解决方法,你可以在第二句scanf语句之前添加一句getchar(),这句是读取一个缓冲区的字符,这样就相当于清除掉第一句之后的回车字符了。
编程就需要多尝试,,二楼说的很对,就是需要自己多写。你的这个程序,你可以尝试一次性输入三个变量,例如:直接输入1.5B2,然后回车,看看运行结果。当然,前提是把第二句中的空格删掉。
你可以看看我之前在一个帖子中的回答。
之前的一个回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-9 22:13:48 | 显示全部楼层
自己写代码试一下不就知道了

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
最后的魁拔 + 1 + 1 + 1 谢谢

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-12-9 22:19:36 | 显示全部楼层
bin554385863 发表于 2019-12-9 22:13
自己写代码试一下不就知道了

那每次都要试吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-9 23:25:33 | 显示全部楼层


比起别人告诉你的答案, 哪个更能让你记得更深刻呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-10 10:03:12 | 显示全部楼层    本楼为最佳答案   
好好学习一下scanf函数的用法。
你的程序中第一个读取的是double类型变量,必须要以空白符(回车、空格、Tab)或者非数字符号(例如ABC、+-*等等)作为分隔符以说明double类型变量已经输入完成了,执行完第一个scanf语句后将会把读取到的double类型赋值给x,然而此时缓冲区中会剩下一个空白符或者去她类型的字符,空白符本身也是一个char类型变量,因此你的第二句scanf执行的时候,若%c之前没有空格,则会将那个空白符赋值给变量ch,那么就会出现你题中所述的现象。
我猜想一下你的程序执行过程:程序开始运行……然后你输入一个double(我们假设为1.5),然后回车,你再输入一个char字符(我们假设是B)……
当你输入1.5,再回车的时候,实际上程序吧1.5赋值给x,缓冲区会剩下一个空白符,当执行第二句scanf时,会把缓冲区的回车当做scanf语句中的空格,然后把B赋值给ch,程序顺利通过。若第二个scanf语句中%c之前没有空格,那么程序会把缓冲区的回车赋值给ch,根本不给你输入B的机会。。。。
解决方法,你可以在第二句scanf语句之前添加一句getchar(),这句是读取一个缓冲区的字符,这样就相当于清除掉第一句之后的回车字符了。
编程就需要多尝试,,二楼说的很对,就是需要自己多写。你的这个程序,你可以尝试一次性输入三个变量,例如:直接输入1.5B2,然后回车,看看运行结果。当然,前提是把第二句中的空格删掉。
你可以看看我之前在一个帖子中的回答。
之前的一个回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表