我正在编写一个程序来计算两个日期之间经过的天数。为此,我必须在如下定义的结构中输入整数形式的日期:
struct date {
int month;
int day;
int year;
};
现在,我已经弄清楚了如何运行我的程序,但当月份或日期是个位数时,用户无法以 (mm dd yyyy) 格式输入日期,这让我很烦恼。让我向您展示我的代码(请不要介意调试 printf 语句):
printf("Enter your start date (mm dd yyyy)\n");
scanf("%i %i %i", &startDate.month, &startDate.day, &startDate.year);
// DEBUG printf("Start date = %i/%i/%i\n", startDate.month, startDate.day, startDate.year);
// DEBUG printf("start date month = %i", startDate.month);
printf("Enter your end date (mm dd yyyy)\n");
scanf("%i %i %i", &endDate.month, &endDate.day, &endDate.year);
// DEBUG printf("End date = %i/%i/%i\n", endDate.month, endDate.day, endDate.year);
如果用户输入:
08 08 2004
那么开始日期记为
0/8/0
等于用户输入的前三位数字。好的,我明白了。我也知道用户只需输入“8 8 2004”,程序运行良好……但我相信编程是关于细节的,而这个是一个错误。谁能帮我解决这个问题?
最佳答案
使用 %i
转换说明符导致 scanf()
解析输入,就像调用 strtol()
时使用 0
作为基本参数一样。因此,由于 08
以 0
开头,而 8
不是 x
或 X
,它将 08
视为一个八进制序列。但是,由于 8
不是有效的八进制数,它就停在那里,第一个数字的结果是 0
。
然后第二个数字得到 8
,因为它由空格分隔。空格被跳过,第三个数字再次将 08
解析为八进制,导致第三个数字为 0
。剩余的 8
和年份 2004
不被解析。
使用 %d
解析十进制数字。
scanf("%d %d %d", &startDate.month, &startDate.day, &startDate.year);
如评论中所述,scanf()
should generally be avoided .作为替代方案,您可以先使用 fgets()
检索整行输入,然后使用 sscanf()
进行解析。这允许更好的错误恢复,因为可以通过导致错误的行来诊断错误,并且也可以优雅地跳过该行。 scanf()
用于结构化输入,只能让您大致了解扫描错误发生的位置。而且,错误会导致输入堵塞,有时会导致调试 session 困惑。
关于c - 使用带有 %i 的 scanf 捕获日期时出现问题 (mm dd yyyy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473705/