0

看一下这段代码,它应该以属于结构的三个变量的形式获取用户的出生日期。

printf("Insert date of birth in this format: dd/mm/yyyy\n");
scanf("%d/%d/%d", &user.bDay, &user.bMonth, &user.bYear);

while(isalpha(user.bDay)==1||isalpha(user.bMonth)==1||isalpha(user.bYear)==1){
    puts("Invalid input");
    scanf("%d/%d/%d", &user.bDay, &user.bMonth, &user.bYear);
}

如果用户输入字符怎么办?像 1q/02/199i 这样的东西?我想让程序打印一条错误消息,并简单地要求用户再次插入他的出生日期。正如您在代码中看到的那样,我尝试使用 isalpha 函数,但它不起作用,程序崩溃并无限次打印“Invalis input”。如何让用户只插入整数?

4

2 回答 2

0

scanf正在扫描输入字符串中的整数。考虑到这一点,我想你的结构是一个结构int,或uint16_t,或类似的东西。

无论如何,用 '检查'这些整数isalpha,就好像它们是字符一样,对你没有帮助。只是一个小例子:如果用户写了“9”(在 ASCII 中是 57),scanf会将其转换为 9。 9 ASCII 不是数字,也不是字母数字字符。

此外,要确认您有一个数字,您需要使用 来检查它isdigit。用isalpha看它不是数字,是不够的;用户可能输入了某种符号,它既不是字母字符也不是数字数字。

但是,必须对用户输入的字符进行这些检查。它们不能对 scanf 填充的整数变量进行。

如果您将用户输入读取为字符串,您可以自己解析它并进行任何您想要的验证(例如,使用strtok在斜杠处拆分它,然后isdigit在每个标记中的每个字符上使用)。

或者,您可以使用 scanf,然后检查您的三个整数,它们每个都在预期的范围内(1-31 代表日,1-12 代表月,等等)。

或者,您可以取消格式化字符串,并分别询问用户的日、月和年,分别验证每一个。

于 2021-07-05T11:07:48.743 回答
0

如何阻止用户插入字符而不是整数

将用户输入读入带有fgets().
scanf()很难使用良好的错误处理。

char buffer[100];
if (fgets(buffer, sizeof buffer, stdin)) {

然后测试字符串的有效性:

  if (sscanf(buffer, "%d /%d /%d", &user.bDay, &user.bMonth, &user.bYear) == 3) {
    Success();
  }
  else {
    puts("Invalid input");
  }
}

根据需要添加其他测试,例如范围限制和尾随垃圾测试。

  char junk;
  if (sscanf(buffer, "%2d /%2d /%4d %c", &user.bDay, &user.bMonth, &user.bYear, &junk) == 3
      && user.bDay >= 1 && user.bMonth >= 1 && user.bMonth <= 12 /* ... */) {
于 2021-07-05T13:28:29.660 回答