如何使用scanf拒绝在日期中混合分隔符的输入(例如2015年1月15日)?

如何使用scanf拒绝在日期中混合分隔符的输入(例如2015年1月15日)?,c,C,我需要检查用户输入是否使用了正确的分隔符。然而,我现在的代码仍然允许例如“15-10/1999”,这是不应该的。不过,我不太确定如何确切地更改while条件以禁止此操作 char delim1, delim2; do { printf("Please enter date (dd-mm-yy or dd/mm/yy):"); scanf("%d%c%d%c%d", &day1, &delim1, &mon1, &delim2, &

我需要检查用户输入是否使用了正确的分隔符。然而,我现在的代码仍然允许例如“15-10/1999”,这是不应该的。不过,我不太确定如何确切地更改while条件以禁止此操作

char delim1, delim2;
do { 
    printf("Please enter date (dd-mm-yy or dd/mm/yy):");   
    scanf("%d%c%d%c%d", &day1, &delim1,  &mon1, &delim2, &year1);
} while (delim1 != '-' && delim1 != '/' && delim2 != '-' && delim2 != '/');
您可以使用:

while (delim1 != delim2 || (delim1 != '-' && delim1 != '/'));
这可确保满足while条件后分隔符相等,并且分隔符为“-”或“/”。

未测试:

char delim1, delim2;
do { 
    printf("Please enter date (dd-mm-yy or dd/mm/yy):");   
    scanf("%d%c%d%c%d", &day1, &delim1,  &mon1, &delim2, &year1);
} while (!(delim1 == '-' && delim2 == '-') || !(delim2 == '&' && delim2 == '&'));

最简单的方法是匹配fmt字符串中的delimeter并检查scanf的返回值

printf("Please enter date (dd-mm-yy or dd/mm/yy):");
while ((cnt == scanf("%u/%u/%u", &day, &mon1, &year1)) != 3) {
    if (cnt == 1 && scanf("-%u-%u", &mon1, &year1) == 2) break;
    if (scanf("%*[^\n]") == EOF) {   // discard the rest of the line
        exit(1);  // alternately clearerr(stdin); if you want to try
        // again despite the error or eof
    }
    printf("Invalid input, please enter date (dd-mm-yy or dd/mm/yy):");
}

您应该在
scanf
调用之后添加
for(int c=getchar();c!='\n'&&c!=EOF;c=getchar()){}
,以便在下次调用
scanf
之前从输入缓冲区中删除任何无关字符。试着用你现有的代码输入
“15-10/1999a”
(或
“1999年4月1日”
)——事情失控了……谁会想到。。。这就是金星的答案。