【问题标题】:How can I make sure the input suits my data types?如何确保输入适合我的数据类型?
【发布时间】:2020-11-15 17:49:44
【问题描述】:

我是 c 语言的新手,并试图在我的程序中编写一个故障保护,以防用户输入错误。

这是故障安全部分:

int h1, m1;
char junk; /* Storing a colon or a period when people type in the hour */

printf("Enter start hour: ");
while (scanf("%d %c %d", &h1, &junk, &m1) != 3)
{
  printf("Invalid, try again\n");
}

在任何输入错误的情况下(例如输入 char 而不是 int),循环只会无限继续下去。如果我单独扫描每个变量,或者在迭代结束时将它们分配为 0,则无关紧要。

我在 Stack 中搜索了答案,但只找到了字符串的方法(基本上移至 'fgets' 或 'isdigit()')或仅用于扫描单个整数。

有没有办法对 int 和 char 数据类型的扫描进行故障保护?

【问题讨论】:

  • junk 是什么?小时、分钟和秒所有内容都是整数,检查小时、分钟和秒的范围,如果它们在正确的范围内,则仅继续,否则报告错误。
  • 我很不清楚。您当前的代码有什么问题?
  • 有一些方法使用字符串,但它们很笨拙。如果您知道典型的良好输入是什么,请输入一个两倍长度的字符串,并使用sscanf() 解析它,而不是使用scanf()。如果输入不符合规范,只需获取另一个。如果用户犯了一个简单的错误,那将很容易处理。如果用户试图弄乱它,或者不知道该怎么做,那么无论如何你都无能为力,除了继续要求输入。

标签: c


【解决方案1】:

简单地说,不。 scanf 不是特别复杂,不能很好地处理“用户可能输入元素,但可能没有”的情况。

我的建议是 - 使用 fgets 或类似方法读取数据,对其进行验证,然后在您确信它是好的时进行翻译。

【讨论】:

    【解决方案2】:

    您可以使用assert.h 库来确保输入是有效的,例如,您可以在代码 sn-p 下断言来检查 h1 是否在有效的小时范围内输入。

    assert( h1 <= 24 && h1 >= 0);
    

    编辑:(感谢前两个 cmets。)

    您可以添加 do junk = getchar(); while (junk != EOF &amp;&amp; junk != '\n'); 以从“\n”中清除您的输入缓冲区,这会导致无休止的行为。

    【讨论】:

    • 它可能被否决了,因为 OP 知道如何做“安全”部分,但不知道如何在输入测试失败时恢复。
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2021-11-13
    相关资源
    最近更新 更多