【问题标题】:Making sure multiple inputs are numbers (c++)确保多个输入是数字(c++)
【发布时间】:2017-09-30 10:43:03
【问题描述】:

我正在制作一个程序,我向用户询问日期并将其与当前日期进行比较。所有的功能都在那里,但我似乎无法验证日期、月份和年份是数字,所以输入字母会使程序崩溃。有任何想法吗? (注意:do while 循环中的函数按预期工作)

do // This do while loop forces the user to enter a valid date before moving on
    {
        cout << "Enter the lent date in the format dd/mm/yyyy: " << endl;
        cin >> day1 >> buffer >> month1 >> buffer >> year1;
        if(cin.fail())
        {
            continue;
        }
    }

    while (!validateDateSize(day1, month1, year1) || !validateDateIntegrity(day1, month1, year1));

【问题讨论】:

标签: c++ validation istream formatted-input


【解决方案1】:

这取决于变量的定义。假设:

int day1, month1, year1; 
char buffer;

输入“12/3/2017”、“12-3-2017”甚至“12.3.2017”等有效日期即可通过测试。输入无效日期但使用有效格式(例如“125.3.2017”)将无法通过测试,并循环以提供下一次正确输入的机会。

那么问题出在哪里?

但如果格式出现问题,例如“12/A/2017”,cin 将在第一个意外字符(此处为“A”)处失败。然后,您的代码将 continue 循环。不幸的是,cin 的失败状态将保持不变,导致任何后续输入失败并且您的代码将永远循环。

如何纠正?

你需要clear()错误状态,还有ignore()导致失败的错误字符还在输入中:

   if(cin.fail())
    {
        cin.clear();                        //reset error flags
        cin.ignore(numeric_limits<streamsize>::max(),'\n');  // and ignore characters until the next newline
        continue;
    }

Online demo

【讨论】:

  • 谢谢。我需要在输入每个 int 变量后放置那个 cin.fail 还是最后一次可以?
  • @stylersolve 我添加了一些附加链接到所使用的函数,以及一个在线演示,您可以在其中使用输入。像你做的那样做测试是可以的。唯一的缺点是您无法确定失败的位置(例如,日期无效,月份或年份)。如果需要,多次失败可以帮助您提供更准确的错误消息。
  • 非常感谢!在这种情况下,实际的错误位置无关紧要。
  • 当我输入一个单词时,两个错误消息都会堆栈(来自函数和 cin.fail)。我想我无法避免这种情况?
  • @stylersolve 这是因为continue 将忽略循环体的其余部分,但会进行条件测试(参见此处:en.cppreference.com/w/cpp/language/continue)。您可以通过在条件中使用附加标志来避免这种情况。此处示例:ideone.com/iAwxlc
【解决方案2】:

在进行任何验证之前,请检查从用户接收到的输入是否为数字。

isdigit(char c)

检查 c 是否为十进制数字字符。

返回值: 如果 c 确实是十进制数字,则该值不同于零(即 true)。否则为零(即假)。

【讨论】:

  • 这是否适用于整数(或者我需要转换),如果数字超过一个字符,例如11 点?
  • 它适用于字符,因此您需要逐字符扫描。
  • 我如何将这些字符连接在一起形成一个整数?例如'2' 和 '1' 组成 21
  • 这是另一种方法。不幸的是,您的答案还不够:它需要在字符串中获取输入并逐个字符地解析它。您能否详细说明您的答案以提供可行的解决方案?
猜你喜欢
  • 1970-01-01
  • 2022-10-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2015-09-29
  • 2015-02-08
  • 2015-05-08
  • 1970-01-01
相关资源
最近更新 更多