Comment puis-je comparer correctement les chaînes?

J’essaie d’obtenir un programme pour permettre à un utilisateur d’entrer un mot ou un caractère, de le stocker, puis de l’imprimer jusqu’à ce que l’utilisateur le saisisse à nouveau, en quittant le programme. Mon code ressemble à ceci:

#include  int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); gets(input); printf("I will now repeat this until you type it back to me.\n"); while (check != input) { printf("%s\n", input); gets(check); } 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 par l’utilisateur (cocher) correspond à l’original (entrée). Est-ce que je compare les deux incorrectement?

Vous ne pouvez pas (utilement) comparer des chaînes en utilisant != Ou == , vous devez utiliser strcmp :

 while (strcmp(check,input) != 0) 

La raison en est que != Et == ne compareront que les adresses de base de ces chaînes. Pas le contenu des chaînes elles-mêmes.

Ok quelques petites choses: fgets(input, sizeof(input), stdin) est dangereux et devrait être remplacé par fgets(input, sizeof(input), stdin) pour ne pas avoir un débordement de buffer.

Ensuite, pour comparer des chaînes, vous devez utiliser strcmp , où une valeur de retour de 0 indique que les deux chaînes correspondent. L’utilisation des opérateurs d’égalité (c’est-à-dire. != ) Compare l’adresse des deux chaînes, par opposition aux caractères individuels qui s’y char .

Et notez également que, bien que dans cet exemple cela ne pose pas de problème, fgets stocke également le caractère de nouvelle ligne, '\n' dans les tampons; gets() ne le fait pas. Si vous fgets() l’entrée utilisateur de fgets() à un littéral de chaîne tel que "abc" elle ne correspondrait jamais (à moins que le tampon soit trop petit pour que le '\n' n’y rentre pas).

EDIT: et battu par le super rapide Mystical une fois de plus.

Vous ne pouvez pas comparer les tableaux directement comme ceci

 array1==array2 

Vous devriez les comparer char-by-char; pour cela, vous pouvez utiliser une fonction et renvoyer une valeur booléenne (True: 1, False: 0). Ensuite, vous pouvez l’utiliser dans la condition de test de la boucle while.

Essaye ça:

 #include  int checker(char input[],char check[]); int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); scanf("%s",input); printf("I will now repeat this until you type it back to me.\n"); scanf("%s",check); while (!checker(input,check)) { printf("%s\n", input); scanf("%s",check); } printf("Good bye!"); return 0; } int checker(char input[],char check[]) { int i,result=1; for(i=0; input[i]!='\0' || check[i]!='\0'; i++) { if(input[i] != check[i]) { result=0; break; } } return result; } 

Utilisez strcmp .

Ceci est dans la bibliothèque ssortingng.h et est très populaire. strcmp renvoie 0 si les chaînes sont égales. Voir ceci pour une meilleure explication de ce que retourne strcmp .

Fondamentalement, vous devez faire:

 while (strcmp(check,input) != 0) 

ou

 while (!strcmp(check,input)) 

ou

 while (strcmp(check,input)) 

Vous pouvez vérifier ceci , un tutoriel sur strcmp .

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

Essayez ce code:

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

Malheureusement, vous ne pouvez pas utiliser strcmp partir de car il s’agit d’un en-tête C ++ et vous avez spécifiquement indiqué qu’il s’agissait d’une application C. J’ai eu le même problème, alors j’ai dû écrire ma propre fonction qui implémente strcmp :

 int strcmp(char input[], char check[]) { for (int i = 0;; i++) { if (input[i] == '\0' && check[i] == '\0') { break; } else if (input[i] == '\0' && check[i] != '\0') { return 1; } else if (input[i] != '\0' && check[i] == '\0') { return -1; } else if (input[i] > check[i]) { return 1; } else if (input[i] < check[i]) { return -1; } else { // characters are the same - continue and check next } } return 0; } 

J'espère que cela vous sert bien.

  #include #include int main() { char s1[50],s2[50]; printf("Enter the character of ssortingngs: "); gets(s1); printf("\nEnter different character of ssortingng to repeat: \n"); while(strcmp(s1,s2)) { printf("%s\n",s1); gets(s2); } return 0; } 

C’est une solution très simple dans laquelle vous obtiendrez votre sortie comme vous le souhaitez.