c - 检查用户是否根据格式输入
问题描述
我有一个系统,其中用户以 HH:MM 格式输入签入时间和签出时间(代码如下)
//category input here
printf("Check in time (HH:MM 24H FORMAT): ");
scanf("%d:%d",&hour,&minute);
printf("Check out time (HH:MM 24H FORMAT): ");
scanf("%d:%d",&hour2,&minute2);
如何根据格式验证用户输入,以免发生此类错误(示例如下)
//example one
category: 2
Check in time (HH:MM 24H FORMAT): 1
Check out time (HH:MM 24H FORMAT): 3
Driver has to pay: $2
//example 2
category: 1
Check in time (HH:MM 24H FORMAT): -1
Check out time (HH:MM 24H FORMAT): 0
Driver has to pay: $1
我试过了
else if (hour >= 24 || hour2 >= 24 || hour < 0 || hour2 < 0){
printf("\nERROR! HOUR SHOULD NOT BE 24 OR EXCEED 24 OR LESS THAN 0\n");
}
除此之外,我对如何检查用户是否使用正确的格式一无所知或解决方案:(
在此先感谢您的帮助
解决方案
考虑使用 . 读取一行用户输入fgets()
。
然后用尾随解析输入字符串以 记录扫描偏移量 - 如果扫描到那么远。sscanf()
"%n"
然后跟进范围比较。
char buf[100];
if (fgets(buf, sizeof buf, stdin)) {
int n = 0;
sscanf(buf, "%d :%d %n", &hour,&minute, &n);
if (n > 0 && minute >= 0 && minute < 60 && hour >= 0 && hour < 24) {
Success(); // OP's custom code here
} else {
Failure(); // OP's custom code here
}
}
允许"24:00"
更改比较
if (n > 0 && minute >= 0 && minute < 60 && hour >= 0 &&
(hour*60 + minute <= 24*60)) {
准确检查 5 个字符和\n
:
sscanf(buf, "%*1[0-2]%*1[0-9]:%*1[0-5]%*1[0-9]%*[\n]%n", &n);
if (n == 6) {
// partial success, now re-scan with "%d:%d" and check positive ranges.
推荐阅读
- reactjs - 无法在 Express 和 React 上更新项目
- typescript - 为这个函数定义一个适用于任意长度元组的类型
- shell - 如何查看当前的 shell/sh/bash 状态以了解它是 set -e 还是 set +e?
- python - gpu上的Tensorflow:tf找不到gpu
- laravel - 从刀片调用组件时出现非法字符串偏移“名称”错误
- influxdb - 如何从influxDB中检索最后一次30天的数据
- java - StickyNestedScrollView 中的 ViewPager
- r - 添加 coord_equal() 时,几何图块沿 Y 轴折叠
- java - 我可以从 IDE 代码模板自动生成代码示例吗?
- reactjs - 数据已更改,但前端未更新