比较C中的struct

时间:2017-01-09 11:55:30

标签: c

我正在学习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;
}

3 个答案:

答案 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;
}

此表单的优点是您现在可以将此功能与标准库函数bsearchqsort及类似函数一起使用。这些函数是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.