【问题标题】:How to compare two structs in c?如何比较c中的两个结构?
【发布时间】:2010-03-03 07:05:16
【问题描述】:

我知道,如果我想比较两个结构而不是我必须为自己编写,因为没有任何功能,但我不知道该怎么做。我有三个结构:主要、次要结构和差异(这应该包含不同的项目)。这三个都有以下成员:char * filename、char * size、int size。

我需要的只是那些不在secondarystruct 中的项目,或者如果它们在,那么我只需要它们的大小大于secondarystruct 的大小。希望你明白我想要什么。我的英语不是最好的,对不起。

这是我尝试过的:

j = 0;
x = 0;
for ( i = 0; i < primarypcs; )
{
    memset( tmp, 0, sizeof( tmp ) );
    l = 1;
    for ( k = 0; k < strlen( primary[i].filename );k++ )
    {
        tmp[k] = primary[i].filename[l];
        l++;
    }
    tmp[k]='\0';

    memset( buf, 0, sizeof( buf ) );
    l = 1;
    for ( k = 0; k < strlen( secondarystruct[j].filename ); k++ ) //<-- here is where my program freezes
    {
        buf[k] = secondarystruct[j].filename[l];
        l++;
    }
    buf[k]='\0';

    if ( ( stricmp( tmp, buf ) == 0 ) && ( x == 0 ) )
    {
        if ( primary[i].intsize > secondarystruct[j].intsize )
        {
            difference[diff].filename = strdup( primary[i].filename );
            difference[diff].size = strdup( primary[i].size );
            difference[diff].intsize = -1;
            diff++;
            i++;
            if ( j == secondarypcs ) x = 1;
            else j++;
        }
        else if ( x == 0 )
        {
            i++;
            if ( j == secondarypcs ) x = 1;
            else j++;
        }
    }
    else
    {
        difference[diff].filename = strdup( primary[i].filename );
        difference[diff].size = strdup( primary[i].size );
        difference[diff].intsize = -1;
        diff++;
        i++;
    }
}

请告诉我我做错了什么!

谢谢,坎皮

更新:

抱歉,我似乎没有给你足够的信息。 所以:两个结构都包含来自不同驱动器的文件列表,如“C:\”和“D:\”。这就是为什么我不能只使用简单的 strcmp 的原因,因为第一个字母总是不同的。这就是为什么我必须“切断它们”然后进行比较。这个程序应该像这样工作:它从 c:\ 检索文件列表,然后从 d:\ 检索文件列表,然后比较它们。如果 c:\ 上的文件在 d:\ 上不存在,则应将其复制到那里,如果 d:\ 上的文件在 c:\ 上不存在,则应忽略它(我不不想与它有任何关系)。如果在 c:\ 和 d:\ 中也找到了一个文件,那么只有当 c:\ 中的文件比 d:\ 上的文件大时,我才想复制它:\

希望你现在明白我想要什么。

【问题讨论】:

  • 离题了,但是,你在每个分支中都在做 i++,为什么不把它放在它所属的 for 循环中呢? :)
  • @roe:您注意到循环条件中使用的增量但错过了 strlen? :P @kampi:我正在谈论的循环(以及buf[k] = '\0' 的下一条语句)最好用 strcpy 调用代替。
  • @kampi:您能否重新表述一下这部分内容——我只需要那些不在二级结构中的项目?你的意思是你需要与一组这样的结构不同吗?另外,如果两个项目的文件名相同,它们何时相等?请注意,您可能不能在一个结构中拥有两个名为 size 的成员。
  • 嗨!我更新了我的问题,希望你现在明白我想要什么:)
  • @Roger: :) 我并没有真正关注任何代码,只是觉得第一个 for 看起来很有趣,所以我只是在寻找 i 的修改。

标签: c windows struct


【解决方案1】:

“冻结”的最可能原因是strlen() 调用,这可能是由某些内存问题引起的(即,它的参数不是指向以零结尾的字符串的指针)。这可能有多种原因:

  • 您的部分内存可能已被缓冲区溢出(tmpbuf)覆盖。
  • 我假设您使用x 作为您已经走到尽头的指标,但在那之后您使用secondarystruct[j]。此外,如果secondarypcsprimarypcs 具有相同的含义,即数组元素的计数,则您使用的是secondarystruct[secondarypcs],但这超出了范围。

其他一些提示:

  • 如果secondarypcs 中的第一个文件在primarypcs 中丢失,那么无论如何,您的代码都会对所有内容进行比较。
  • 比较字符串而不考虑第一个字母可以这样完成:

    (*str1 && *str2 ? strcmp(str1+1, str2+1) : -1)

我建议这样的代码:

void add_to_difference(struct diff_file* f);

...

// assuming primarystruct and secondarystruct are arrays of diff_file sorted by filename
j=0;
for(i=0; i<primarypcs; i++) {
  // find a passibly matching secondary file
  while(j<secondarypcs && strcmp(primarystruct[i].filename+1, secondarystruct[j].filename+1)<0)
    j++;
  // not found... add all overflow items to diff
  if(j>=secondarypcs) {
    for(; i<primarypcs; i++)
      add_to_diff(primarystruct+i);
    break;
  }
  // do the comparison
  if(strcmp(primarystruct[i].filename+1, secondarystruct[j].filename+1)>0 || 
    primarystruct[i].intsize>secondarystruct[j].intsize)
    add_to_diff(primarystruct+i);
  // that's it
}

【讨论】:

  • 非常感谢!这正是我所需要的!
【解决方案2】:

如果你有相同的结构变量。访问结构体变量的每个成员,然后进行适当的比较。您需要根据数据类型比较这些值。

【讨论】:

    【解决方案3】:

    您可以使用 memcmp() 函数比较结构。 如果您在 memcmp 中指定结构及其长度,它将比较并以整数形式返回结果,就像 strcmp 一样。

    但它比 strcmp() 函数更好。它直接处理内存。所以它可以准确地给出结果。

    【讨论】:

      【解决方案4】:

      您必须逐个字段比较结构。对 char* 字符串使用 strcmp,对整数使用比较运算符。通常你会创建一个单独的函数进行比较,如果结构相同,该函数将返回 0,如果第一个“更小”,则返回负值,如果第一个更大,则返回正值。

      【讨论】:

      • 在结构上使用 memcmp 有点冒险,因为里面可能有填充,然后你最终也会比较它。
      【解决方案5】:

      如果你只是想完成你所说的,这代码太多了。

      只需使用 strcmp() 来比较文件名和大小,使用 ">" 来比较大小。然后根据比较结果,您可以使用 strdup() 或简单的“=”将适当的成员复制到差异结构中。

      if (!strcmp(first.filename, second.filename) { ...当它们不同时该怎么办... } if (!strcmp(first.size, second.size) { ...当它们不同时该怎么办... } if (first.intsize != second.intsize) { ..ETC... }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-18
        • 2013-05-05
        相关资源
        最近更新 更多