web-dev-qa-db-fra.com

Comparer deux chaînes en C?

Ce code ne fonctionne pas car la comparaison n'est pas en cours. Pourquoi?

Tous les noms dépassent la if.

printf("Enter Product: \n");
scanf("%s", &nameIt2);
printf("Enter Description: \n");
scanf("%s", &descriptionI);
printf("Enter Quantity: \n");
scanf("%d", &qtyI);
printf("Enter Order Quantity: \n");
scanf("%s", &ordqtyI);

while (fscanf(fp4, "%s %s %d %s\n", &namet2, &description2, &qty2, &ordqty2) != EOF){
    if(namet2 != nameIt2)
        fprintf(fpt2, "%s %s %d %s\n", &namet2, &description2, qty2, &ordqty2);
}
27
user1955438

Pour comparer deux chaînes C (char *), utilisez strcmp() . La fonction retourne 0 lorsque les chaînes sont égales, vous devrez donc utiliser ceci dans votre code:

if (strcmp(namet2, nameIt2) != 0)

Si vous utilisez (à tort)

if (namet2 != nameIt2)

vous comparez les pointeurs (adresses) des deux chaînes, qui sont inégaux lorsque vous avez deux pointeurs différents (ce qui est toujours le cas dans votre situation).

56
Veger

Pour comparer 2 chaînes, utilisez la fonction intégrée strcmp() à l'aide du fichier d'en-tête string.h

if(strcmp(a,b)==0)
    printf("Entered strings are equal");
else
    printf("Entered strings are not equal");

OU vous pouvez écrire votre propre fonction comme ceci:

int string_compare(char str1[], char str2[])
{
    int ctr=0;

    while(str1[ctr]==str2[ctr])
    {
        if(str1[ctr]=='\0'||str2[ctr]=='\0')
            break;
        ctr++;
    }
    if(str1[ctr]=='\0' && str2[ctr]=='\0')
        return 0;
    else
        return -1;
}
9
Aakash

Vous comparez actuellement les adresses des deux chaînes.

Utilisez strcmp pour comparer les valeurs de deux tableaux de caractères

 if (strcmp(namet2, nameIt2) != 0)
7
simonc

Vous essayez de comparer les pointeurs ici, pas le contenu de ce qui est pointé (vos personnages, par exemple).

Vous devez utiliser memcmp ou str{,n}cmp pour comparer le contenu.

3
fge

Pour répondre au POURQUOI dans votre question:

Parce que l'opérateur d'égalité ne peut être appliqué qu'à des types de variables simples, tels que floats, ints ou chars, et not à des types plus sophistiqués, tels que structures ou tableaux ..__ les chaînes sont égales, vous devez explicitement comparer les deux chaînes de caractères, caractère par caractère. 

2
Amjad

Le nom du tableau indique l'adresse de départ. Les adresses de départ de namet2 et nameIt2 sont différentes. Ainsi, l'opérateur égal à (==) vérifie si les adresses sont identiques ou non. Pour comparer deux chaînes, une meilleure méthode consiste à utiliser strcmp() ou de comparer caractère par caractère à l'aide d'une boucle.

2
Rajesh
if(strcmp(sr1,str2)) // this returns 0 if strings r equal 
    flag=0;
else flag=1; // then last check the variable flag value and print the message 

                         OR

char str1[20],str2[20];
printf("enter first str > ");
gets(str1);
printf("enter second str > ");
gets(str2);

for(int i=0;str1[i]!='\0';i++)
{
    if(str[i]==str2[i])
         flag=0;
    else {flag=1; break;}
}

 //check the value of flag if it is 0 then strings r equal simple :)
1
vaibhav sharma

Vous devez utiliser strcmp:

strcmp(namet2, nameIt2)
1
jgr