C 如何确保输入适合我的数据类型?

C 如何确保输入适合我的数据类型?,c,C,我不熟悉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) { pri

我不熟悉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

我在堆栈中搜索答案,但只找到字符串的方法(基本上移动到“fgets”或“isdigit()”),或者只找到扫描单个整数的方法


是否有一种方法可以对int和char数据类型的扫描进行故障保护?

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

assert( h1 <= 24 && h1 >= 0);
assert(h1=0);
编辑:(感谢前两条评论。)


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

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


我的建议是-使用
fgets
或类似工具读取数据,验证数据,然后在确信数据正确后进行翻译。

什么是
垃圾
?小时、分钟和秒一切都是整数,检查小时、分钟和秒的范围,如果它们在正确的范围内,则只进行其他操作报告错误。我非常不清楚。您当前的代码有什么问题?这是否回答了您的问题?有些方法不使用字符串,但它们很笨拙。如果您知道典型的良好输入是什么,请输入一个长度为该长度两倍的字符串,并使用
sscanf()
而不是使用
scanf()
对其进行解析。如果输入不符合规格,只需获取另一个。如果用户犯了一个简单的错误,这将很容易处理。如果用户试图搞乱它,或者不知道该怎么做,那么除了继续要求输入,你无论如何也无能为力。它可能被否决了,因为OP知道如何做“安全”部分,但不知道如何在输入测试失败时恢复。