Probleme avec getch (C)

Résolu
bassistar -  
 bassistar -
Salut la communauté :) , bon je suis entrain de développer un petit programme en C servant a saisir un mot de passe de l'utilisateur sous forme d'étoiles (*) , j'ai utilisé la boucle suivante :
do
{ch1[i]=getch();
printf("*");
i++;}
while (ch1[i-1] != '\r');
mais lors de l'affichage du contenu de ch1 avec printf , ça me sort un nombre d'une grande valeur o_O ; un certain 2293552 qui est bizarrement constant même si ce n'est pas le même mot de passe tapé !
J'attends vos réponses , merci .



A voir également:

7 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Par contre, tu as oublié de mettre un \0 à la fin de ta chaîne.
Du coup, le printf bug.
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,
As-tu bien mis i=0, avant le do ?
Et comment affiches-tu ch1 avec printf ?
0
bassistar
 
Je l'ai bien initialisé a 0 et le printf("ch1= %s",ch1);
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Comment a été déclaré le tableau ch ?
Cdlt,
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bassistar
 
char ch1[20];
et merci Fiddy pour ton attention :)
0
bassistar
 
je viens d'ajouter la ligne suivante avant le printf :
ch1[strlen(ch1)]='\0';
mais toujours le même problème :/
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
strlen(ch1), tu peux pas l'utiliser puisqu'il n'y a pas encore de \0.
Il faut le faire à la mano.
La meilleure place est en dehors du while. Tu détectes que l'utilisateur a cliqué sur '\r'. Tu mets donc un '\0' juste après.
Et il faudrait aussi penser à vérifier que l'utilisateur n'a pas appuyé sur plus de 19 caractères.
0
bassistar
 
Bien évidemment , j'ai ajouté le \0 juste après le while et lors de l'exécution je ne tape pas plus que 5 caractères pour éviter les bugs , tu ne crois pas que c'est un problème de \r qui se stocke a la fin de la chaine?
Cordialement
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Non ça ne doit pas être ça. Mais, c'est vrai que le mieux c'est de le supprimer. Cela t'aidera par la suite pour vérifier le mot de passe.
Poste ton programme avec l'initialisation de i ainsi que tous les changements que tu as fait. Tu ne dois plus être très loin maintenant.
0
bassistar
 
Ah tien , je viens de changer le ch1[strlen(ch1)] par ch(strlen(ch1)-1]) et ça affiche le mot de passe nikel :D mais il reste encore un petit problème c'est que lorsque je le compare avec une autre chaine , le compilateur les considère comme deux chaines différentes car ça m'affiche pas le message "ok".

Voici le code source :

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{char ch1[20],ch2[20];
int i=0;

printf("Tapez le mot de passe : \n");
do
{ch1[i]=getch();
printf("*");
i++;}
while (ch1[i-1] != '\r');
ch1[strlen(ch1)-1]='\0';
printf("%s \n",ch1);
scanf("%s",ch2);
if (ch1==ch2)
printf("ok");
system("PAUSE");
return EXIT_SUCCESS;
}
0
bassistar
 
bien évidemment les 2 chaines ch1 et ch2 contiennent le même mot
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Tu n'as pas tenu compte de ma remarque sur le strlen : tu ne peux pas l'utiliser car il n'y a pas encore de \0 à ce moment.
Mets à la place ch1[i-1]='\0'; (comme ça tu récris sur le '\r').
if(ch1==ch2); -> C'est archi faux. Tu compares deux adresses et non les contenus des tableaux. Il faut utiliser la fonction strcmp. : if (strcmp(ch1,ch2)==0)
0
bassistar
 
Ouai merci énormément ça vient de marcher =D , j'apprécie beacoup ton soutien :) , bonne courage pour ton site web ;)
Cheers
0
bassistar
 
bon* :p
0