| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 836 人关注过本帖
标题:这个程序在get nights()模块输入非整数,程序还是会继续运行,请问是什么 ...
只看楼主 加入收藏
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
结帖率:96.15%
收藏
已结贴  问题点数:15 回复次数:7 
这个程序在get nights()模块输入非整数,程序还是会继续运行,请问是什么问题?
#include <stdio.h>
#define QUIT 5
#define HOTEL1 80.00
#define HOTEL2 125.00
#define HOTEL3 155.00
#define HOTEL4 200.00
#define DISCOUNT 0.95
#define STARS "***************************"

int menu();
int getnights();
void showprice(double, int);
int main()
{
    int nights;
    double hotel_rate;
    int code;
   
    while((code = menu()) != QUIT)
    {
        switch(code)
        {
            case 1: hotel_rate = HOTEL1;
                break;
            case 2: hotel_rate = HOTEL2;
                break;
            case 3: hotel_rate = HOTEL3;
                break;
            case 4: hotel_rate = HOTEL4;
                break;
            default: hotel_rate = 0.0;
                printf("Oops!\n");
                break;
        }
        nights = getnights();
        showprice(hotel_rate, nights);
    }
    printf("Thank you and goodbye. ");
    return 0;
}

int menu()
{
    int code, status;
   
    printf("\n%s%s\n", STARS, STARS);
    printf("Enter the number of the desired hotel: \n");
    printf("1) Fairfield Arms    2) Hotel Olympic\n");
    printf("3) Chertworthy Plaza 4) The Stockton\n");
    printf("5) quit\n");
    printf("%s%s\n", STARS, STARS);
    while((status = scanf("%d", &code)) != 1 ||
          (code < 1 || code > 5))
    {
        if(status != 1)
            scanf("%*s");
        printf("Enter an integer from 1 to 5, please.\n");
    }
    return code;
}

int getnights()
{
    int nights;
   
    printf("How mant nights are needed?  ");
    while(scanf("%d", &nights) != 1)
    {
        scanf("%*s");
        printf("Please enter an integer, such as 2.\n");
    }
    return nights;
}

void showprice(double rate, int nights)
{
    int n;
    double total = 0.0;
    double factor = 1.0;
    for(n = 1; n <= nights; n++, factor *= DISCOUNT)
        total += rate * factor;
    printf("The total cost will be $%0.2f. \n", total);
   
}

输入4.1 结果是
4.1
How mant nights are needed?  Please enter an integer, such as 2.
因为这个模块上的while语句里已经限定了输入值必须是整数才会输出how many nights are needed?但不知怎么的输入浮点数之后循环和外部同时进行,百思不得其解。求教
搜索更多相关主题的帖子: include double 
2016-08-07 16:21
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
int getnights()
{
    int nights;
   
    printf("How mant nights are needed?  ");
    while(scanf("%d", &nights) != 1)
    {
        scanf("%*s");
        printf("Please enter an integer, such as 2.\n");
    }
    return nights;
}
就是这一段
2016-08-07 16:22
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:15 
你在while(scanf("%d", &nights) != 1)这句之前加一句fflush(stdin)(头文件stdlib.h)
这是因为你输入小数,实际上int menu()函数里的code是被成功赋值,例如输入“4.1”,code被成功赋值“4”,这样输入流里就遗留“.1”。
由于遗留的“.1”对接下来的nights赋值,很明显,赋值失败。
这就是为什么你输入 4.1会直接跳到int getnights()这个函数里的while循环里了。
2016-08-07 17:39
liuwen0721
Rank: 1
等 级:新手上路
帖 子:3
专家分:5
注 册:2016-7-14
收藏
得分:0 
2016-08-08 11:14
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 3楼 linlulu001
我试过了可还是不行啊,输入4.1还是跟原来一样的问题
2016-08-08 11:42
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

怎么可能,你是不是没加对地方
int getnights()
{
    int nights;
   
    printf("How mant nights are needed?  ");
    fflush(stdin);   //头文件stdlib.h
    while(scanf("%d", &nights) != 1)
    {
        scanf("%*s");
        printf("Please enter an integer, such as 2.\n");
    }
    return nights;
}
2016-08-08 14:15
Eahonxu
Rank: 1
等 级:新手上路
帖 子:113
专家分:0
注 册:2016-7-13
收藏
得分:0 
回复 6楼 linlulu001
肯定又是我的软件问题--哎 xcode出了不少硬伤了
2016-08-08 16:46
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
将fflush(stdin)换成scanf("%*[^\n]")可能有用。毕竟scanf("%*[^\n]");的移植性比fflush更好。
scanf("%*[^\n]");来清空缓冲区,这里要注意的是它会保留下“\n”。再加上scanf("%*c");这句,读取保留下来的\n。
如果有用而fflush没用的话,你以后可以用这两句来清空输入流。
2016-08-08 18:19
快速回复:这个程序在get nights()模块输入非整数,程序还是会继续运行,请问是 ...
数据加载中...
 
   



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

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