返回指向结构

时间:2016-03-12 19:35:25

标签: c pointers struct return

我有这个程序,你在两个结构中输入两个日期(相同的类型),然后我想要一个函数来查找我输入的日期是更晚的日期。它仅比较年和月。一旦找到更晚的日期,我希望函数返回指向具有较晚日期的结构的指针。然后我想打印出更晚的日期。

这是我到目前为止所做的,但我得到错误,我不确定指针语法。

代码:

#include <stdio.h>

struct date{
     int year;
     int month;
     int day;
};


main()
{
    struct date dates[2];
    int i = 0, res = 0;

    for ( i = 0 ; i < 2 ; i++){
        printf("Enter a year!");
        scanf("%d", &dates[i].year);

        printf("Enter a month!");
        scanf("%d", &dates[i].month);

        printf("Enter a day!");
        scanf("%d", &dates[i].day);
    }

    res = later(&dates[1], &dates[2]);

}

struct date *later(struct date *one, struct date *two)
{

    if (one->year > two->year){
        return *one;
    }       

    else if (one->year == two->year){
        if(one->month > two->month){
            return *one;        
        }   
        else 

        return *two;
    }

    else {
        return *two;    
    }

}

错误讯息:

q4.c:28:3: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
    printf("%d", &res);
    ^
q4.c: At top level:
q4.c:32:14: error: conflicting types for ‘later’
    struct date *later(struct date *one, struct date *two){
                 ^
q4.c:26:9: note: previous implicit declaration of ‘later’ was here
    res = later(&dates[1], &dates[2]);
          ^
q4.c:55:1: error: expected identifier or ‘(’ before ‘}’ token
    }

2 个答案:

答案 0 :(得分:1)

您的计划存在多个问题:

  1. 您的函数没有原型later()
    解决方案:
    在结束结构日期声明后添加date *later(date *one, date *two);或将整个函数移到main()之上。< / LI>
  2. 当您返回指向日期对象的指针时,将函数的返回类型更改为date*
  3. 如果要存储指向日期对象的指针,请将res的数据类型更改为date*
  4. 然后通过单独打印每个组件来打印指向res的对象,因为printf不是为打印自定义数据类型而设计的。
  5. 这只是一个建议,但我建议你将int i的声明移到for(int i = 0; i < 2; i++);它只是被认为更好并节省了内存。
  6. 如果你想让res成为一个int,你将不得不返回一个对象而不是指针,然后将它强制转换为int。类型转换指南:http://www.cplusplus.com/doc/tutorial/typecasting/

答案 1 :(得分:0)

正如评论中指出的那样,有许多方法可以处理回报。您可以将later函数声明为int(正如您所知),并使用类似于strcmp的返回值返回(0 - 日期相等,{{ 1}}首先比最后一个早,-1首先比最后一个晚。)

您也可以将1声明为later并返回指向较晚日期的指针(如果日期相同,则会让您知道要返回的内容)。

如果您返回类似于struct date *的{​​{1}}值,则返回更有意义。根据第一个之前的等效,比较您的int并返回strcmpstruct date的实施方案以后可能是:

-1, 0

注意:使用1运算符(例如int later (struct date *one, struct date *two) { /* the ternary operator is your friend */ if (one->year != two->year) /* years differ */ return one->year > two->year ? 1 : -1; if (one->month != two->month) /* months differ */ return one->month > two->month ? 1 : -1; if (one->day != two->day) /* days differ */ return one->day > two->day ? 1 : -1; return 0; /* dates are equivalent */ } )来简单比较每个日期组件)

另外,请注意,在这种情况下,您可以自由地传递ternary而不是test ? if true : if false,因为该函数可以在每个struct date结构的副本上正常运行。这取决于你想要的方式。

测试该功能的一个小样本程序(并注意到一些代码改进)可能是:

struct date *

示例使用/输出

date

仔细看看,如果您有其他问题,请告诉我。