sempre_zhou 发表于 2017-11-13 14:07:47

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

#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 这样的,程序就会出错,请问如何对这种错误进行识别呢?
谢谢大家了,小弟初来乍到请多多指教!

BngThea 发表于 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;
}

sempre_zhou 发表于 2017-11-14 11:58:09

谢谢BngThea 的指教~
按照您的方法,程序确实能够忽略小数点以及之后的数据了
输入输出如下

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

时间:1:3

但是此时程序不会报错,不知道如何修改能够在输入类似小数点这样的非法数据时,能够提示重新输入呢~?

BngThea 发表于 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 << ("请输入正确的小时格式:");
                                }
                        }       
                }
        }
页: [1]
查看完整版本: 如何对多个小数点(1.1.1)这种非法输入进行识别