鱼C论坛

 找回密码
 立即注册
查看: 2145|回复: 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
结束输入小时后对流进行清空即可
  1. #include<iostream>

  2. void time(int, int);

  3. int main()
  4. {
  5.         int hour;
  6.         std::cout << ("请输入小时数:");
  7.         while (!(std::cin >> hour) | hour < 0 | hour >23)  // 非法输入
  8.         {
  9.                 std::cin.clear();
  10.                 std::cin.ignore(100, '\n');
  11.                 std::cout << ("请输入正确的小时格式:");
  12.         }
  13.         std::cin.clear();
  14.         std::cin.ignore(100, '\n');
  15.         int minute;
  16.         std::cout << ("请输入分钟数:");
  17.         while (!(std::cin >> minute) | minute < 0 | minute >59)  // 非法输入
  18.         {
  19.                 std::cin.clear();
  20.                 std::cin.ignore(100, '\n');
  21.                 std::cout << ("请输入正确的分钟格式:");
  22.         }

  23.         time(hour, minute);

  24.         std::cin.get();
  25.         std::cin.get();
  26.         return 0;
  27. }

  28. void time(int h, int min)
  29. {
  30.         std::cout << std::endl << ("时间:") << h << (":") << min << std::endl << std::endl;
  31. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

  2. void time(int, int);

  3. int main()
  4. {
  5.         int hour;
  6.         std::cout << ("请输入小时数:");
  7.         while (!(std::cin >> hour) | hour < 0 | hour >23)  // 非法输入
  8.         {
  9.                 std::cin.clear();
  10.                 std::cin.ignore(100, '\n');
  11.                 std::cout << ("请输入正确的小时格式:");
  12.         }
  13.         std::cin.clear();
  14.         std::cin.ignore(100, '\n');
  15.         int minute;
  16.         std::cout << ("请输入分钟数:");
  17.         while (!(std::cin >> minute) | minute < 0 | minute >59)  // 非法输入
  18.         {
  19.                 std::cin.clear();
  20.                 std::cin.ignore(100, '\n');
  21.                 std::cout << ("请输入正确的分钟格式:");
  22.         }

  23.         time(hour, minute);

  24.         std::cin.get();
  25.         std::cin.get();
  26.         return 0;
  27. }

  28. void time(int h, int min)
  29. {
  30.         std::cout << std::endl << ("时间:") << h << (":") << min << std::endl << std::endl;
  31. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> 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 的指教~
按照您的方法,程序确实能够忽略小数点以及之后的数据了
输入输出如下

要对逻辑进行一下重新的设计:

  1. int hour;
  2.         char next;//用来存储已读取数据的下一个字符,如果有的话
  3.         std::cout << ("请输入小时数:");
  4.         while (1)
  5.         {
  6.                 if (std::cin>>hour)
  7.                 {
  8.                         if (hour < 0 || hour > 23)
  9.                         {
  10.                                 std::cin.clear();
  11.                                 std::cin.ignore(100, '\n');
  12.                                 std::cout << ("请输入正确的小时格式:");
  13.                                 continue;
  14.                         }
  15.                         if (!std::cin)//如果后面没有字符,那么证明输入正确,跳出循环
  16.                         {
  17.                                 break;
  18.                         }
  19.                         else // 后面有字符,对字符进行判断
  20.                         {
  21.                                 std::cin.get(next);
  22.                                 if (isspace(next))//如果后面的字符是空格之类的,说明输入正确,跳出循环
  23.                                 {
  24.                                         break;
  25.                                 }
  26.                                 else
  27.                                 {
  28.                                         std::cin.clear();
  29.                                         std::cin.ignore(100, '\n');
  30.                                         std::cout << ("请输入正确的小时格式:");
  31.                                 }
  32.                         }       
  33.                 }
  34.         }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 21:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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