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



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

printf("Insert date of birth in this format: dd/mm/yyyyn");
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);
}

如果用户键入字符怎么办?类似于199i年2月1日?我想让程序打印一条错误消息,并简单地要求用户再次插入他的出生日期。我试着使用isalpha函数,正如你在代码中看到的那样,但它不起作用,程序崩溃并打印";Invalis输入";无限次。如何让用户只插入整数?

scanf正在扫描输入字符串中的整数。考虑到这一点,我假设您的结构是intuint16_t或类似的结构

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

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

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

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

或者,您可以使用scanf,然后检查您的三个整数,确保它们都在预期范围内(1-31表示天,1-12表示月,等等(

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

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

使用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 /* ... */) {

最新更新