scanf与我的代码结构不兼容

时间:2017-03-12 09:43:55

标签: c struct dev-c++

我正在做Steven G.Kochan的“Programming in C”一书,第3版。目前正致力于第9章 - 使用结构体。问题的主要部分如下,代码中的公式在问题中提供:

  

编写一个程序,允许用户键入两个日期然后   计算两个日期之间经过的天数。尝试   将程序逻辑地组织成单独的函数。例如,   你应该有一个接受日期作为参数的函数   结构并返回N的值。然后可以调用此函数两次,   每个日期一次,并确定数量的差异   已过去的日子。

我写的代码也在下面....但它没有正常工作:我附上一张图片作为证据,请帮我弄清问题是什么output screen showing that it doesn't allow me enter the second date.

#include <stdio.h>
struct date
    {
        int day;
        int month;
        int year;
    };          

//function declarations
    int f (struct date thisDate);
    int g (struct date thisDate);

int main(void)
{


    //declarations and initializations
    struct date theDate, otherDate;
    int N1, N2, days;



    printf("Enter the first Date (dd/mm/yyyy):");
    scanf("%i/%i/%i", &theDate.day, &theDate.month, &theDate.year);

    // compute N1 
    N1 = (1461 * f(theDate) ) / 4 + (153 * g(theDate)) / 5 + 3;  //this can be replaced with a function


    printf("\nEnter the  second Date (dd/mm/yyyy):");
    scanf("%i/%i/%i", &otherDate.day, &otherDate.month, &otherDate.year);

    // compute n2 
    N2 = (1461 * f(otherDate) ) / 4 + (153 * g(otherDate)) / 5 + 3;  //this can be replaced with a function

    days = N2 - N1;
    printf("\nThere are %i days between these two dates",days);

    return 0;
}

int f (struct date thisDate)
    {
        if (thisDate.month <= 2)
            {
                return thisDate.year - 1;
            }
        else
            {
                return thisDate.year;
            }
    }

int g (struct date thisDate)
    {
        if ( thisDate.month <= 2)
            {
                return thisDate.month + 13;                 
            }
        else
            {
                return thisDate.month + 1;
            }
    }

1 个答案:

答案 0 :(得分:1)

查看图像,输入字符串为03/09/2007;在进行计算之前,第二个输入不会等待输入任何新内容。

问题是您使用的%i读取八进制,十六进制或十进制数字。八进制数由前导零表示;因此,09转换为该月的0(因为9不是有效的八进制数字; 08也会产生问题),然后转换失败(没有{{在那之后0.}}。下一个输入以/9开头,然后找不到2007,因此它会停止。

多重道德:

  1. 检查/的返回值。在此代码中,确保它返回3;如果不是,就会出现问题。
  2. 不要使用scanf()来阅读日期值;使用%i。人们不使用八进制,有时会输入%d(和09)。
  3. 验证您阅读的数字。将它们打印出来很有帮助 - 它可以让你看看程序是否达到了预期的效果。