【发布时间】:2019-04-25 15:52:48
【问题描述】:
我在 gcc 编译器上使用 ANSI C(使用 -ansi)。
我需要将用户输入的月、日、小时和分钟读入一个结构,他们:
- 不能是非 int 的数据类型,
- 每个人都需要符合个人标准(
i.e. month > 0 && month < 13等)
结构定义
typedef struct
{
int month;
int day;
int hour;
int minute;
} date_time_t;
date_time_t departure_date[50];
使用字符串转换进行类型检查
如果用户向scanf("%i", departure_date->month); 提供“~”,我想检查用户输入以阻止程序崩溃
所以我首先像这样将值作为字符串读取:
char temp_month[3]
char *ptr;
scanf("%s", temp_month)
然后像这样对用户输入进行类型检查:
当输入不符合条件时 -> 请求符合条件的输入
while(strtol(temp_month, &ptr, 36) < 1 ||
strtol(temp_month, &ptr, 36) > 12)
{
printf("Invalid selection - try again\n");
scanf(" %s", temp_month);
}
一旦满足while条件,我将临时变量存储在结构中:
departure_date->month = atoi(temp_month);
几个问题...
- 这是正常的做事方式吗?请记住,我受限于结构只有 int 数据类型。
- 当我在 scanf 期间向月份提交击键“a、b、c 或 d”时,它通过了我在其中进行类型检查的 while 循环设定的标准,但字母表中没有其他字母这样做 - 确实有人知道为什么吗?
【问题讨论】:
-
您可以阅读
scanf的手册页 - 1。它返回一个值 2。您可以使用 format 参数来确保字符数组不会溢出。 -
抱歉我不明白,你能给我举个例子吗?
-
if (scanf("%2s", temp_month) == 1) ....是你需要的东西