这个简单的程序通过确定明天的日期来演示结构的使用。它要求输入今天的日期:
#include <stdlib.h>
#include <stdio.h>
int main ( int argc, char *argv[] )
{
struct date {
int month;
int day;
int year;
}; /* ---------- end of struct date ---------- */
struct date today, tomorrow;
const int daysPerMonth[12] = { 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31 };
printf ( "Enter today's date (mm dd yyyy): \n" );
scanf ( "%i%i%i", &today.month, &today.day, &today.year );
if ( today.day != daysPerMonth[today.month - 1] ) {
tomorrow.day = today.day + 1;
tomorrow.month = today.month;
tomorrow.year = today.year;
}
else if ( today.month == 12 ) { /* end of year */
tomorrow.day = 1;
tomorrow.month = 1;
tomorrow.year = today.year + 1;
}
else { /* end of month */
tomorrow.day = 1;
tomorrow.month = today.month + 1;
tomorrow.year = today.year;
}
printf ( "Tomorrow's date is %i/%i/%.2i.\n", tomorrow.month,
tomorrow.day, tomorrow.year % 100 );
return EXIT_SUCCESS;
} /* ---------- end of function main ---------- */
运行时,我得到了什么:
输入今天的日期(mm dd yyyy):
06 09 2014
明天的日期是6/1/09。
但是当我运行gdb并输出输入值时:
(gdb) p today.month
$1 = 6
(gdb) p today.day
$2 = 0
(gdb) p today.year
$3 = 9
我很困惑。为什么输入会得到不正确的值?
答案 0 :(得分:3)
嘿。 %i
的{{1}}说明符表示读取一系列整数格式,类似于为C整数文字指定的格式。
当您输入前导scanf
时,表示后面的内容是八进制数字。由于0
不是有效的八进制数字,因此只读取值9
。 0
留给以下9
,因此读取的三个数字为%i
,6
,0
,其中9
位于输入流。
要在基数10中输入,请将2014
更改为%i
,然后您的程序才能正常运行。
答案 1 :(得分:3)
您将输入读作scanf ( "%i%i%i", &today.month, &today.day, &today.year );
。
由于您在输入中加上0
前缀,因此它们被视为八进制,从而导致结果。
您应该使用scanf("%d%d%d", ...);
代替。