| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 851 人关注过本帖
标题:scanf 无法使用?
取消只看楼主 加入收藏
PlusA2T
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-9-23
结帖率:100%
收藏
 问题点数:0 回复次数:3 
scanf 无法使用?
这是自己做的 BMI 计算器…如果正常输入数字的话就没有问题
但如果我打英文的话…会不断出现 “Don't trick me, Again(in Meters):” 但是不会让我输入字串…
程序代码:
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    float height = 0, weight = 0, BMI = 0;
    int OK = 0;
    printf("Welcome to BMI calculator.\nPlease type your height first(in Meters):");
    while(!OK){
        OK = scanf("%f", &height);
        if(height >0 && OK){
            printf("\nWell, not so tall :)\nAnd..Your Weight(in Kilograms):");
            OK = scanf("%f", &weight);
            while(weight <= 0 || !OK) {
                printf("\nAgain(in Kilograms):");
                OK = scanf("%f", &weight);
            }
        } else {
            printf("\nDon't trick me, Again(in Meters):");
            OK = scanf("%f", &height);
        }
        if(!height || !weight) OK = 0;
    }
    BMI = weight / (height * height);
    printf("\nOk..your BMI is: %.2f\n", BMI);
    system("pause");
    return 0;
}
搜索更多相关主题的帖子: trick 计算器 
2012-09-23 22:21
PlusA2T
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-9-23
收藏
得分:0 
以下是引用w995612220在2012-9-24 00:03:55的发言:

 OK = scanf("%f", &height);
        getchar();或者 OK = scanf("       %f", &height);//这个好像也是可以的但是解释我也是在论坛看的我也不是很明白这是为什么。。好像是吸收前面的非字母吧!
解释就是你输入的回车键算一个字符串,你要用getchar()吸收掉回车键。还有你的程序英文太差就不帮你验证了。。不好意思了

回车键不是最后按的吗?吸收的话都应该放最后呀
始终是不行呀…
scanf() 能用做过滤字元吗?
例:只让用户输入浮点数,如果输入字母或者是其它符号就给它一个错误讯息后再让用户重新输入!
程序代码:
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
    float height = 0, weight = 0, BMI = 0;
    int OK = 0;
    printf("Welcome to BMI calculator.\nPlease type your height first(in Meters):");
    while(!OK){
        while (scanf("%f", &height) != 1 || height <= 0){
            if (height <= 0) printf("\nDon't trick me, Again(in Meters):");
        }
        printf("\nWell, not so tall :)\nAnd..Your Weight(in Kilograms):");
        while(scanf("%f", &weight) != 1 || weight <= 0) {
            printf("\nAgain(in Kilograms):");
        }
        OK = (height && weight) ? 1 : 0;
    }
    BMI = weight / (height * height);
    printf("\nOk..your BMI is: %.2f\n", BMI);
    return 0;
}
2012-09-24 10:45
PlusA2T
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-9-23
收藏
得分:0 
以下是引用ldzy在2012-9-24 17:04:31的发言:

在printf("\nDon't trick me, Again(in Meters):");
            OK = scanf("%f", &height);
两句之间加while(getchar()!='\n')continue;即
printf("\nDon't trick me, Again(in Meters):");
       while(getchar()!='\n')continue;
            OK = scanf("%f", &height);
这种问题也算常见,但是回复的不多,也许是没分吧。

谢谢大大!但是可以解释一下吗?
分享一下最后成品(这是一个 BMI 计算器):
程序代码:
//
//  BMIC.c
//  BMIC
//
//  Created by PlusA2T on 12/9/23.
//

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

int main(void)
{
    float height = 0, weight = 0, BMI = 0;
    int OK = 0;
    printf("Welcome to BMI calculator.\nPlease type your height first(in Meters):");
    while(!OK){
        while (scanf("%f", &height) != 1 || height <= 0){
            if (height <= 0) printf("\nDon't trick me, Again(in Meters):");
            while(getchar()!='\n') continue;
        }
        printf("\nWell, not so tall :)\nAnd..Your Weight(in Kilograms):");
        while(scanf("%f", &weight) != 1 || weight <= 0) {
            printf("\nAgain(in Kilograms):");
            while(getchar() != '\n') continue;
        }
        OK = (height && weight) ? 1 : 0;
    }
    BMI = weight / (height * height);
    printf("\nOk..your BMI is: %.2f\n", BMI);
    return 0;
}


[ 本帖最后由 PlusA2T 于 2012-9-25 03:06 编辑 ]
2012-09-25 03:00
PlusA2T
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2012-9-23
收藏
得分:0 
以下是引用heishu在2012-9-25 09:20:43的发言:

OK = scanf("%f", &height);首先我想这句语句的意思是:函数输入正确返回为1负给ok,输入不正确返回0给ok;
所以输入字符是,ok被负0;函数无限循环执行 else {
            printf("\nDon't trick me, Again(in Meters):");
            OK = scanf("%f", &height);
        }
这条语句。而且这句不执行OK = scanf("%f", &height);

不太明白…
请问 Ok 被负 0 是甚么意思?在甚么条件下才会令函数无限循环执行


以下是引用ldzy在2012-9-25 16:36:32的发言:

第十楼已经讲得差不多了。我补充一个,有关printf(),scanf()要有输入输出缓冲区的概念。当scanf()未能读取指定形式的输入时,它就留下这个不相容的输入,以供下次读取(抄书,)。 while(getchar()!='\n')continue;跳过输入行剩余部分。

第一个点明白了…所以第一次要的东西就放进变数里,不要就放在缓冲里,有用的时侯就会拿出来,是吧?
但是“跳过输入行剩余的部分”又是甚么意思?
我只理解到…如果用户不按回车,那就不会让程式继续走下去
2012-09-27 01:01
快速回复:scanf 无法使用?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027661 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved