Je sais, que si je veux comparer deux structs que je dois l'écrire pour moi-même, parce qu'il n'y a aucune fonction pour cela, mais je ne peux pas comprendre comment devrais-je faire cela. J'ai trois structures: primaire, secondarystruct, et différence (ceci devrait contenir les différents articles). Tous les trois ont les membres suivants: char * filename, char * size, int size. Tout ce dont j'ai besoin, ce sont les éléments qui ne sont pas dans la chaîne secondaire, ou s'ils en ont besoin, je n'en ai besoin que si leur taille est plus grande que la taille du secondaire. J'espère que vous comprenez ce que je veux. Mon anglais n'est pas le meilleur, désolé pour cela.Comment comparer deux structs dans c?
Voici ce que j'ai essayé:
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++;
}
}
S'il vous plaît me dire ce que je fais mal!
Merci, Kampi
Mise à jour:
Désolé, il semble, je vous ai donné des informations ne suffit pas. Donc: les deux structures contiennent une liste de fichiers, provenant de différents lecteurs, comme "C: \" et "D: \". C'est la raison pour laquelle je ne peux pas utiliser simplement strcmp, car la première lettre sera toujours différente. C'est pourquoi je dois les "couper" et ensuite comparer. Ce programme devrait fonctionner comme ceci: Il récupère la liste de fichiers de c: \ et récupère ensuite la liste de fichiers de d: \, puis les compare. Si le fichier qui est sur c: \ n'existe pas sur d: \ alors il devrait être copié là, si sur d: \ il y a un fichier qui n'existe pas sur c: \ alors il devrait être ignoré (je ne sais pas Je ne veux rien faire avec ça. Si un fichier que l'on trouve dans c: \ et d: \, alors je ne le copierai que si le fichier de c: \ a une taille plus grande qu'un fichier qui est sur d: \
J'espère que vous comprenez maintenant ce que je veux.
Hors sujet, mais encore, vous faites i ++ dans chaque branche, pourquoi ne pas mettre cela dans la boucle for où il appartient? :) – falstro
@roe: Vous avez remarqué que l'incrément mais manqué strlen utilisé dans une condition de boucle? : P @kampi: Les boucles dont je parle (et l'instruction suivante de 'buf [k] = '\ 0'') sont mieux remplacées par des appels strcpy. –
@kampi: Pouvez-vous reformuler la partie - _Ill faut-il des éléments qui ne sont pas dans le secondarystruct_? Voulez-vous dire que vous avez besoin de la différence d'un ensemble de ces structures? De même, quand deux éléments sont-ils égaux si leurs noms de fichiers sont identiques? Notez que vous ne pouvez probablement pas avoir deux membres appelés taille dans une seule structure. – dirkgently