鱼C论坛

 找回密码
 立即注册
查看: 1606|回复: 14

C语言问题

[复制链接]
发表于 2016-10-20 08:02:32 | 显示全部楼层 |阅读模式
5鱼币

# include <stdio.h>


int main(void)
{
   float a,b,t,c,d;
   printf("请输入两个整数:\n");
   printf("a = ");
   c = scanf("%f", &a);
   printf("b = ");
   d = scanf("%f", &b);
   printf("%f %f", c,d);
  

   if (c!=1 || d!=1)
           {
                   printf("您输入的不是整数,请重新输入:\n");
                   printf("a = ");
                   scanf("%f", &a);
                   printf("b = ");
                   scanf("%f", &b);
           }


为什么第一个输入数字,第二个输入字母时,等下执行if结果就莫名其妙?没有执行scanf?

最佳答案

查看完整内容

int main(void) { float a,b; int c d; printf("请输入两个整数:\n"); printf("a = "); c = scanf("%f", &a); printf("b = "); d = scanf("%f", &b); printf("%f %f", c,d); if (c!=1 || d!=1) { printf("您输入的不是整数,请重新输入:\n"); printf("a = "); scanf("%f", &a); printf("b = ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 08:02:33 | 显示全部楼层
int main(void)
{
float a,b;
int c d;
   printf("请输入两个整数:\n");
   printf("a = ");
   c = scanf("%f", &a);
   printf("b = ");
   d = scanf("%f", &b);
   printf("%f %f", c,d);
  

   if (c!=1 || d!=1)
           {
                   printf("您输入的不是整数,请重新输入:\n");
                   printf("a = ");
                   scanf("%f", &a);
                   printf("b = ");
                   scanf("%f", &b);
           }
}
浮点类型和整形的相等或不等比较不能直接比
比如
int     a = 1;
float  b = 1; (其实是1.0000000000000000000..)

a和b肯定不相等

所以你要想比较浮点型 要类似这种
#define EPSILON 0.00000000001 // (.0个数根据精度需要来定)

float a;
float b;

if (a - b < EPSILON)
  printf("a < b\n");

if (a - b > EPSILON)
  printf("a > b\n");

if (a - b <= EPSILON ) // 误差在你定义的范围内就认为相等了
  printf("a == b\n");
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 08:15:57 | 显示全部楼层
逻辑错误,c d在if 前没有输入啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 09:31:55 | 显示全部楼层
因为第二个输入的是字母,scanf的返回值为0,scanf执行失败。这时候需要使用fflush(stdin)来清理输入缓冲区。这样后面的scanf才能正常输入。还有就是浮点型比较不能直接“!=”,这样不严谨。具体看3L的回复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-20 10:40:58 | 显示全部楼层
数字跟字母返回值都是0,所以if语句条件不成立所以就没有再执行scanf了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-20 20:29:58 | 显示全部楼层
alltolove 发表于 2016-10-20 10:40
数字跟字母返回值都是0,所以if语句条件不成立所以就没有再执行scanf了

为什么if哪里没有显示输入?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-25 15:10:00 | 显示全部楼层
ryxcaixia 发表于 2016-10-20 09:23
int main(void)
{
float a,b;

scanf("%d",&c);
scanf("%d",&d);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-10-26 17:18:09 | 显示全部楼层
看看运算符优先级
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-1 14:32:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-2 10:19:26 | 显示全部楼层
musilintan 发表于 2016-10-20 09:31
因为第二个输入的是字母,scanf的返回值为0,scanf执行失败。这时候需要使用fflush(stdin)来清理输入缓冲区 ...

那怎样才能使scanf执行成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-16 20:51:36 | 显示全部楼层
逻辑错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-16 23:11:38 | 显示全部楼层
本帖最后由 四十二 于 2016-11-16 23:13 编辑

只有四楼说到点子上了~!!!

另外,在比较新的c规范里尽量不要使用fflush这个指令,具体用什么我卖个关子,楼主把鱼币打赏我之后我会一步一步指点你调出来,调出为止。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-21 21:31:46 | 显示全部楼层
我只知道存在浮点数比较问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-24 12:56:49 | 显示全部楼层
3L说的好详细
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-24 16:45:34 | 显示全部楼层
本帖最后由 zzg9929 于 2016-11-24 16:46 编辑

清除输入缓冲区~你输入第一个数,回车也跟着存进去了就是你的输入缓冲区有个\0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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