我正在学习C中的结构,我不知道一种方便的方法来测试我的时间结构,以测试它是否是午夜。
“if”行有语法错误(error: expected expression
):
if (UpdatedDaT.stime == { 0, 0, 0})// If midnight
UpdatedDaT.sdate = dateUpdate(DaT.sdate)
以下是我的程序中的一些代码:
struct date
{
int month;
int day;
int year;
};
struct time
{
int hour;
int minutes;
int seconds;
};
struct dateAndTime
{
struct date sdate;
struct time stime;
};
struct dateAndTime clockKeeper(struct dateAndTime DaT)
{
struct dateAndTime UpdatedDaT = { .stime = timeUpdate(DaT.stime) };
if ( UpdatedDaT.stime == { 0, 0, 0} )// If midnight
UpdatedDaT.sdate = dateUpdate(DaT.sdate);
else
UpdatedDaT.sdate = DaT.sdate;
return UpdatedDaT;
}
int main(void)
{
struct dateAndTime DaT;
printf("Enter date and time (mm dd yyyy hh:mm:ss): ");
scanf("%i %i %i %i:%i:%i", &DaT.sdate.month, &DaT.sdate.day, &DaT.sdate.year,
&DaT.stime.hour, &DaT.stime.minutes, &DaT.stime.seconds);
struct dateAndTime UpdatedDaT = clockKeeper(DaT);
printf("\nThe UpdatedDaT is %i/%i/%.2i %.2i:%.2i:%.2i\n",
UpdatedDaT.sdate.month, UpdatedDaT.sdate.day, UpdatedDaT.sdate.year,
UpdatedDaT.stime.hour, UpdatedDaT.stime.minutes, UpdatedDaT.stime.seconds);
return 0;
}
答案 0 :(得分:3)
您无法将结构与==
进行比较(也不应使用memcmp
)。
最好的方法是编写一个自定义比较函数,比较给定类型的两个struct对象。如果第一个结构被认为小于,等于或大于第二个结构,建议以函数的形式执行此操作,该函数返回小于零,零或大于零的整数。
使用以下格式:
int compare_date (const void* obj1, const void* obj2)
{
const date* d1 = obj1;
const date* d2 = obj2;
int diff;
diff = d1->year - d2->year;
if(diff != 0)
return diff;
diff = d1->month - d2->month;
if(diff != 0)
return diff;
diff = d1->day - d2->day;
return diff;
}
此表单的优点是您现在可以将此功能与标准库函数bsearch
,qsort
及类似函数一起使用。这些函数是void指针的原因 - 它是一种在C中编写比较函数的通用的,类型无关的方式。(有时这些被称为“仿函数”。)
答案 1 :(得分:2)
这不是有效的C语法 - 你只能逐个元素地比较结构。
变化:
if (UpdatedDaT.stime == { 0, 0, 0})// If midnight
为:
if (UpdatedDaT.stime.hour == 0 &&
UpdatedDaT.stime.minutes == 0 &&
UpdatedDaT.stime.seconds == 0)// If midnight
答案 2 :(得分:1)
更方便的方法是使用记忆比较功能,即memcmp
首先定义并初始化一个默认变量,用于检查其他数据,如
/* To zero out everything */
memset(DefaultDaT, 0, sizeof(DefaultDaT));
memset(UpdatedDaT, 0, sizeof(UpdatedDaT));
DefaultDaT.stime.hour = 0;
DefaultDaT.stime.minutes = 0;
DefaultDaT.stime.seconds =0;
然后简单地比较一下
if (memcmp(DefaultDaT, UpdatedDaT, sizeof(DefaultDaT)) == 0) // If midnight.