鱼C论坛

 找回密码
 立即注册
查看: 2386|回复: 3

[已解决]如何对多个小数点(1.1.1)这种非法输入进行识别

[复制链接]
发表于 2017-11-13 14:07:47 | 显示全部楼层 |阅读模式

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

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

x
#include<iostream>

void time(int, int);

int main()
{
        int hour;
        std::cout << ("请输入小时数:");
        while (!(std::cin >> hour) | hour < 0 | hour >23)  // 非法输入
        {
                std::cin.clear();
                std::cin.ignore(100, '\n');
                std::cout << ("请输入正确的小时格式:");
        }

        int minute;
        std::cout << ("请输入分钟数:");
        while (!(std::cin >> minute) | minute < 0 | minute >59)  // 非法输入
        {
                std::cin.clear();
                std::cin.ignore(100, '\n');
                std::cout << ("请输入正确的分钟格式:");
        }

        time(hour, minute);

        std::cin.get();
        std::cin.get();
        return 0;
}

void time(int h, int min)
{
        std::cout << std::endl << ("时间:") << h << (":") << min << std::endl << std::endl;
}

格式如下:

请输入小时数:
请输入分钟数:

时间:

现在考虑到的非法输入有字母符号和超出取值范围的整数
但是如果输入例如 1.1.1 这样的,程序就会出错,请问如何对这种错误进行识别呢?
谢谢大家了,小弟初来乍到请多多指教!
最佳答案
2017-11-13 15:03:49
结束输入小时后对流进行清空即可
#include<iostream>

void time(int, int);

int main()
{
        int hour;
        std::cout << ("请输入小时数:");
        while (!(std::cin >> hour) | hour < 0 | hour >23)  // 非法输入
        {
                std::cin.clear();
                std::cin.ignore(100, '\n');
                std::cout << ("请输入正确的小时格式:");
        }
        std::cin.clear();
        std::cin.ignore(100, '\n');
        int minute;
        std::cout << ("请输入分钟数:");
        while (!(std::cin >> minute) | minute < 0 | minute >59)  // 非法输入
        {
                std::cin.clear();
                std::cin.ignore(100, '\n');
                std::cout << ("请输入正确的分钟格式:");
        }

        time(hour, minute);

        std::cin.get();
        std::cin.get();
        return 0;
}

void time(int h, int min)
{
        std::cout << std::endl << ("时间:") << h << (":") << min << std::endl << std::endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-13 15:03:49 | 显示全部楼层    本楼为最佳答案   
结束输入小时后对流进行清空即可
#include<iostream>

void time(int, int);

int main()
{
        int hour;
        std::cout << ("请输入小时数:");
        while (!(std::cin >> hour) | hour < 0 | hour >23)  // 非法输入
        {
                std::cin.clear();
                std::cin.ignore(100, '\n');
                std::cout << ("请输入正确的小时格式:");
        }
        std::cin.clear();
        std::cin.ignore(100, '\n');
        int minute;
        std::cout << ("请输入分钟数:");
        while (!(std::cin >> minute) | minute < 0 | minute >59)  // 非法输入
        {
                std::cin.clear();
                std::cin.ignore(100, '\n');
                std::cout << ("请输入正确的分钟格式:");
        }

        time(hour, minute);

        std::cin.get();
        std::cin.get();
        return 0;
}

void time(int h, int min)
{
        std::cout << std::endl << ("时间:") << h << (":") << min << std::endl << std::endl;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-14 11:58:09 | 显示全部楼层
谢谢BngThea 的指教~
按照您的方法,程序确实能够忽略小数点以及之后的数据了
输入输出如下

请输入小时数:1.2
请输入分钟数:3.4

时间:1:3

但是此时程序不会报错,不知道如何修改能够在输入类似小数点这样的非法数据时,能够提示重新输入呢~?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-16 15:41:57 | 显示全部楼层
sempre_zhou 发表于 2017-11-14 11:58
谢谢BngThea 的指教~
按照您的方法,程序确实能够忽略小数点以及之后的数据了
输入输出如下

要对逻辑进行一下重新的设计:
int hour;
        char next;//用来存储已读取数据的下一个字符,如果有的话
        std::cout << ("请输入小时数:");
        while (1)
        {
                if (std::cin>>hour)
                {
                        if (hour < 0 || hour > 23)
                        {
                                std::cin.clear();
                                std::cin.ignore(100, '\n');
                                std::cout << ("请输入正确的小时格式:");
                                continue;
                        }
                        if (!std::cin)//如果后面没有字符,那么证明输入正确,跳出循环
                        {
                                break;
                        }
                        else // 后面有字符,对字符进行判断
                        {
                                std::cin.get(next);
                                if (isspace(next))//如果后面的字符是空格之类的,说明输入正确,跳出循环
                                {
                                        break;
                                }
                                else
                                {
                                        std::cin.clear();
                                        std::cin.ignore(100, '\n');
                                        std::cout << ("请输入正确的小时格式:");
                                }
                        }        
                }
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 21:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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