我有这个程序,你在两个结构中输入两个日期(相同的类型),然后我想要一个函数来查找我输入的日期是更晚的日期。它仅比较年和月。一旦找到更晚的日期,我希望函数返回指向具有较晚日期的结构的指针。然后我想打印出更晚的日期。
这是我到目前为止所做的,但我得到错误,我不确定指针语法。
代码:
#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
}
答案 0 :(得分:1)
您的计划存在多个问题:
later()
date *later(date *one, date *two);
或将整个函数移到main()
之上。< / LI>
date*
。date*
。int i
的声明移到for(int i = 0; i < 2; i++);
它只是被认为更好并节省了内存。 如果你想让res成为一个int,你将不得不返回一个对象而不是指针,然后将它强制转换为int。类型转换指南:http://www.cplusplus.com/doc/tutorial/typecasting/
答案 1 :(得分:0)
正如评论中指出的那样,有许多方法可以处理回报。您可以将later
函数声明为int
(正如您所知),并使用类似于strcmp
的返回值返回(0
- 日期相等,{{ 1}}首先比最后一个早,-1
首先比最后一个晚。)
您也可以将1
声明为later
并返回指向较晚日期的指针(如果日期相同,则会让您知道要返回的内容)。
如果您返回类似于struct date *
的{{1}}值,则返回更有意义。根据第一个之前的,等效或,比较您的int
并返回strcmp
或struct 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
仔细看看,如果您有其他问题,请告诉我。