程序演示结构未收到正确的输入值

时间:2014-06-10 02:49:27

标签: c structure

这个简单的程序通过确定明天的日期来演示结构的使用。它要求输入今天的日期:

#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 

我很困惑。为什么输入会得到不正确的值?

2 个答案:

答案 0 :(得分:3)

嘿。 %i的{​​{1}}说明符表示读取一系列整数格式,类似于为C整数文字指定的格式。

当您输入前导scanf时,表示后面的内容是八进制数字。由于0不是有效的八进制数字,因此只读取值90留给以下9,因此读取的三个数字为%i60,其中9位于输入流。

要在基数10中输入,请将2014更改为%i,然后您的程序才能正常运行。

答案 1 :(得分:3)

您将输入读作scanf ( "%i%i%i", &today.month, &today.day, &today.year );

由于您在输入中加上0前缀,因此它们被视为八进制,从而导致结果。

您应该使用scanf("%d%d%d", ...);代替。