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);
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 de l'utilisateur (check) correspond à l'original (input). Est-ce que je compare les deux de manière incorrecte ?
Vous ne pouvez pas (utilement) comparer des chaînes de caractères 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 de caractères elles-mêmes.
Ok, quelques petites choses : gets
n'est pas sûr et doit être remplacé par fgets(input, sizeof(input), stdin)
afin d'éviter un dépassement de tampon.
Ensuite, pour comparer des chaînes de caractères, vous devez utiliser strcmp
, où une valeur de retour de 0 indique que les deux chaînes de caractères correspondent. L'utilisation des opérateurs d'égalité (par exemple, !=
) permet de comparer l'adresse des deux chaînes de caractères, et non les caractères individuels qu'elles contiennent.
Notez également que, bien que dans cet exemple cela ne pose pas de problème, fgets
stocke le caractère de nouvelle ligne, '\n'`` dans les tampons également ;
gets()ne le fait pas. Si vous compariez l'entrée de l'utilisateur provenant de
fgets()à une chaîne littérale telle que
"abc", elle ne correspondrait jamais (à moins que le tampon ne soit trop petit pour que le
'\n'` y rentre).
EDIT : et battu par le super rapide Mysticial une fois de plus.
Vous ne pouvez pas comparer directement des tableaux comme ceci
array1==array2
Vous devez les comparer caractère par caractère ; pour cela, vous pouvez utiliser une fonction et renvoyer une valeur booléenne (True:1, False:0). Vous pouvez ensuite l'utiliser dans la condition de test de la boucle while.
Essayez ceci :
#include <stdio.h>
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;
}