错误:类型冲突,错误:形式参数2的类型不完整

时间:2018-12-16 03:49:35

标签: c function structure

  

我正在编写一个代码,计算两个给定日期之间的天数差异。请注意,每个月被认为等于30天,每年被认为等于360天。

     

我收到以下警告/错误,但我似乎不明白为什么:

Warning&Errors

这是我的代码:

#include <stdio.h>

int dif_days(struct Date Date1, struct Date Date2);

struct Date
{
    int Day;
    int Month;
    int Year;
};

int main()
{
    struct Date Date1;
    struct Date Date2;

    printf("\n Please enter the first date: ");
    scanf("%d %d %d ", &Date1.Day, &Date1.Month, &Date1.Year);

    printf("\n Please enter the second date: ");
    scanf("%d %d %d ", &Date2.Day, &Date2.Month, &Date2.Year);

    int diff = dif_days(Date1, Date2);
    printf("\n The difference in days is: %d \n", diff);

    return 0;
}

int dif_days(struct Date Date1, struct Date Date2)
{
    // variable declaration 
    int difference;
    int Day, Month, Year; // The final days/months/years

    // for the days
    if (Date1.Day > Date2.Day)
        Day = Date1.Day - Date2.Day;
    else    
        Day = Date2.Day - Date1.Day;

    // for the months
    if (Date1.Month > Date2.Month) 
        Month = Date1.Month - Date2.Month;
    else
        Month = Date2.Month - Date1.Month;

    // for the years
    if (Date1.Year > Date2.Year)
        Year = Date1.Year - Date2.Year;
    else        
        Year = Date2.Year - Date1.Year;       

    difference = Day + Month*30 + Year*360;                

    return difference;
}

1 个答案:

答案 0 :(得分:1)

struct Date的函数原型中使用dif_days()之前,需要对其进行声明。

您可以将struct的整个定义移到函数原型之前,也可以在函数原型之前添加struct的正向声明:

struct Date;

此外,您需要从scanf()格式字符串中删除结尾的空白字符。 This plays havoc with interactive input, and does not do what people usually seem to expect.请注意,%d指令会自动忽略前导空白字符,实际上,忽略的唯一scanf()指令是%c%n%[]

在我们讨论scanf()时,您应该检查对scanf()的调用返回的值,以确保输入符合预期。格式字符串匹配失败后,scanf()将继续运行,而不会在其余变量中存储任何内容。当代码尝试使用不确定的值时,无效的输入将导致未定义的行为。如果输入了三个数字,scanf()将在此处返回3,对于基本验证,您可以检查用户是否确实输入了三个数字,然后再继续。