c - 如何比较c中的两个结构?

标签 c windows struct

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

我只需要那些不在 secondarystruct 中的项目,或者如果它们在 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:\中的文件大时我才不想复制它

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

最佳答案

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

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

一些其他提示:

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

    (*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
}

关于c - 如何比较c中的两个结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2369347/

相关文章:

更改指向结构的指针,通过引用传递

c - 将 C 结构翻译为 Fortran 等价物

c - 简单程序: checking if one array is included in another or viceversa

c - Windows C 运行时 _close(fd) 不关闭文件

windows - Powershell 替换包含以下内容的文件的路径

c# - 编写 Windows 文件管理器应用程序的最佳编程语言

C—修改数据时出现段错误

c - c中的哈希表和时间复杂度

c - 我无法更改文本的字体

C++ memcpy 将结构体转换为字节数组