【发布时间】: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 的修改。