249 votes

Comment comparer correctement les cordes en C ?

J'essaie de faire en sorte qu'un programme permette à un utilisateur de saisir un mot ou un caractère, de le mémoriser, puis de l'imprimer jusqu'à ce que l'utilisateur le saisisse à nouveau, en quittant le programme. Mon code ressemble à ceci :

#include <stdio.h>

int main()
{
    char input[40];
    char check[40];
    int i=0;
    printf("Hello!\nPlease enter a word or character:\n");
    gets(input);   /* obsolete function: do not use!! */
    printf("I will now repeat this until you type it back to me.\n");

    while (check != input)
    {
        printf("%s\n", input);
        gets(check);   /* obsolete function: do not use!! */
    }

    printf("Good bye!");

    return 0;
}

Le problème est que je continue à obtenir l'impression de la chaîne d'entrée, même lorsque l'entrée de l'utilisateur (check) correspond à l'original (input). Est-ce que je compare les deux de manière incorrecte ?

17 votes

gets( ) a été supprimé de la norme. Utilisez fgets( ) à la place.

1 votes

Notez que cette respuesta à Pourquoi est-ce que strcmp() retourne zéro lorsque ses entrées sont égales explique comment comparer des chaînes de caractères pour l'égalité, l'inégalité, moins que, plus que, moins que ou égal, et plus que ou égal. Les comparaisons de chaînes de caractères ne sont pas toutes des comparaisons d'égalité. Les comparaisons sensibles à la casse sont encore différentes ; d'autres comparaisons spéciales (ordre du dictionnaire, par exemple) nécessitent des comparateurs plus spécialisés, et il existe des regex pour des comparaisons encore plus complexes.

0 votes

Notez également qu'il y a une question essentiellement dupliquée Comment vérifier si une valeur correspond à une chaîne de caractères ? qui a été posée des années auparavant.

5voto

Chaque fois que vous essayez de comparer des chaînes de caractères, comparez-les par rapport à chaque caractère. Pour cela, vous pouvez utiliser la fonction intégrée de chaîne de caractères appelée strcmp(input1,input2) ; et vous devriez utiliser le fichier d'en-tête appelé #include<string.h>

Essayez ce code :

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h>  

int main() 
{ 
    char s[]="STACKOVERFLOW";
    char s1[200];
    printf("Enter the string to be checked\n");//enter the input string
    scanf("%s",s1);
    if(strcmp(s,s1)==0)//compare both the strings  
    {
        printf("Both the Strings match\n"); 
    } 
    else
    {
        printf("Entered String does not match\n");  
    } 
    system("pause");  
}

3voto

mustafa candan Points 311

Vous devez utiliser strcmp() et vous devez #include <string.h>

El != y == ne comparent que les adresses de base de ces chaînes. Pas le contenu des chaînes

while (strcmp(check, input))

Exemple de code :

#include <stdio.h>
#include <string.h>

int main()
{
    char input[40];
    char check[40] = "end\n"; //dont forget to check for \n

    while ( strcmp(check, input) ) //strcmp returns 0 if equal
    {
        printf("Please enter a name: \n");
        fgets(input, sizeof(input), stdin);
        printf("My name is: %s\n", input);
    }

    printf("Good bye!");
    return 0;
}

Note1 : gets() n'est pas sûr. Utilisez fgets() au lieu de

Note2 : Lorsque vous utilisez fgets() vous devez vérifier si '\n' nouveau personnage de la ligne aussi

3voto

Anic17 Points 501

Tu peux :

Utilice strcmp() de string.h qui est la version la plus facile

Ou si vous voulez faire le vôtre, vous pouvez utiliser quelque chose comme ceci :

int strcmp(char *s1, char *s2)
{
    int i;
    while(s1[i] != '\0' && s2[i] != '\0')
    {
        if(s1[i] != s2[i])
        {
            return 1;
        }
        i++;
    }
    return 0;
}

J'utiliserais strcmp() d'une manière comme celle-ci :

while(strcmp(check, input))
{
    // code here
}

2voto

chux Points 13185

Comment comparer correctement les cordes ?

char input[40];
char check[40];
strcpy(input, "Hello"); // input assigned somehow
strcpy(check, "Hello"); // check assigned somehow

// insufficient
while (check != input)

// good
while (strcmp(check, input) != 0)
// or 
while (strcmp(check, input))

Creusons un peu plus pour voir pourquoi check != input n'est pas suffisant .

En C, chaîne de caractères est une spécification de la bibliothèque standard.

A chaîne de caractères est une séquence contiguë de caractères terminée par et incluant le premier caractère nul.
C11 §7.1.1 1

input ci-dessus n'est pas un chaîne de caractères . input es tableau 40 de caractères .

Le contenu de input peut devenir un chaîne de caractères .

Dans la plupart des cas, lorsqu'un tableau est utilisé dans une expression, il est converti à l'adresse de son 1er élément.

Le tableau ci-dessous convertit check y input à leurs adresses respectives du premier élément, puis ces adresses sont comparées.

check != input   // Compare addresses, not the contents of what addresses reference

Pour comparer chaînes de caractères nous devons utiliser ces adresses et examiner les données vers lesquelles elles pointent.
strcmp() fait le travail . §7.23.4.2

int strcmp(const char *s1, const char *s2);

El strcmp compare la chaîne de caractères pointée par s1 à la chaîne de caractères pointée par s2 .

El strcmp renvoie un nombre entier supérieur, égal ou inférieur à zéro, de même que la chaîne de caractères pointée par s1 est supérieure, égale ou inférieure à la chaîne de caractères pointée par s2 .

Le code peut non seulement déterminer si les chaînes de caractères sont de la même donnée, mais aussi laquelle est la plus grande ou la plus petite lorsqu'elles diffèrent.

Ce qui suit est vrai lorsque les chaînes de caractères sont différentes.

strcmp(check, input) != 0

Pour en savoir plus, voir Créer mon propre strcmp() fonction

-2voto

Rupani T D Points 7
    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char s1[50],s2[50];
        printf("Enter the character of strings: ");
        gets(s1);
        printf("\nEnter different character of string to repeat: \n");
        while(strcmp(s1,s2))
        {
            printf("%s\n",s1);
            gets(s2);
        }
        return 0;
    }

C'est une solution très simple qui vous permettra d'obtenir le résultat que vous souhaitez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X