besoin d'aide

besoin d'aide - C - Programmation

Marsh Posté le 08-01-2006 à 12:38:29    

bonjour, je doit réaliser un programme en C qui permette de saisir un mot de passe d'un  
utilisateur.
 
Détails :
- 5 utlisateurs et 5 mots de passe correspondant seront stockés dans un  
fichier.
- Le couple <login, passwd >sera testé. S'il est correct (existant dans le  
fichier précédent) un message  
d'acceptation sera affiché, sinon un message "<login> : vous n'avez pas  
rentré le bon mot de passe !" sera affiché.
- Toutes les tentatives seront stockées dans un fichier de log.
 
sans utiliser  getpass()
 
je demande votre aide car j'ai enormementde mal en programmation Cdonc si vous pourriez me donner quelque pistes afin que je reussise a réaliser ce programme
 
merci d'avance

Reply

Marsh Posté le 08-01-2006 à 12:38:29   

Reply

Marsh Posté le 08-01-2006 à 12:44:37    

Rien de standard, ça dépend du système d'exploitation.
 
Si interdiction d'utiliser getpass() et que tu es sur un unixoïde, la solution est de reconfigurer le terminal pour enlever l'écho de la saisie au clavier.
Voir tcgetattr(), tcsetattr(), termios, etc.

Reply

Marsh Posté le 08-01-2006 à 12:49:08    

en fait c un exo de prog C que j'ai à rendre sur visual C++ et le prof doit faire fonctionner le progrmame et verifier qu'il marche
 
voila merci

Reply

Marsh Posté le 08-01-2006 à 12:51:41    

propose ton code, ensuite on voit ce qui va ou pas. Ce sont les règles de la cat.


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 08-01-2006 à 12:53:41    

ok je comprend mai ca va etre dur car je sais meme pas comment partir car je suis une merde  
mais merci quand meme

Reply

Marsh Posté le 08-01-2006 à 15:04:51    

mimou33 a écrit :

ok je comprend mai ca va etre dur car je sais meme pas comment partir car je suis une merde


Si c'est ça, on tire la chasse d'eau, et on en parle plus.
 
La réussite commence par l'estime de soi. Commence par travailler ça...
 
Ensuite écrit l'algorithme.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-01-2006 à 18:30:07    

je m'estime mais quand tu sais pas tu sais pas, c pas grave
merci

Reply

Marsh Posté le 08-01-2006 à 18:35:11    

Si tu ne fais pas le moindre effort, on ne peux pas t'aider

Reply

Marsh Posté le 09-01-2006 à 03:14:10    

mimou33 a écrit :

ok je comprend mai ca va etre dur car je sais meme pas comment partir


 
Une boucle de saisie du nom et du mot de passe, un appel à une fonction qui vérifie (elle-aussi à l'aide d'une boucle) si le couple est présent dans le fichier et qui renvoie 0 ou 1 selon le cas. Et un enregistrement du nom saisi et du mot de passe dans un fichier log. Rien de bien sorcier...
 

mimou33 a écrit :

je sais meme pas comment partir


partir, c'est mourir un peu... mais mourir c'est partir beaucoup  :D


Message édité par Sve@r le 09-01-2006 à 03:15:21

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 09-01-2006 à 17:55:34    

#include <stdio.h>
#include <io.h>
 
 
struct acces {
 char login[10];
 char mdp[10];
};
 
void main()
{
char x[10],y[10],mot[10];
struct acces tableau[5];
short resultat;
FILE *liste, *test;
short i=0;
 
//Lecture des mots de passe dans le fichier
 
// espion
if((liste=fopen("H:\\rattrapage\\save1.txt","r" ))==NULL){
fprintf(stderr,"Probleme d'ouverture\n" );
exit(1);
}
 
while (!feof(liste))
{
fscanf(liste,"%s\n",mot);
printf("%s\n",tableau[i].login);
scanf("%*c" );
tableau[i].login=mot;
fscanf(liste,"%s\n",mot);
tableau[i].mdp=mot;
i++;
}
 
fclose(liste);
 
while(1){
 
//entrées des données
 printf("Login :\n" );
 scanf("%s%*c",&x);
 printf("Password :\n" );
 scanf("%s%*c",&y);
 
//Comparaison
 
//Ecriture des tentatives dans le fichier
test=fopen("H:\\rattrapage\\save2.txt","w" );
fprintf(test,"login testé : %s ---- Mot de passe : %s\n",x,y);
fclose(test);
 
for(i=0;i<5;i++){
 
 if(x==tableau[i].login && y==tableau[i].mdp){
  /*Acces autorisé*/
  printf("<Acces autorisé au login : %s>\n",x);
  exit(0);
 }
}
/*Acces refusé*/
printf("<login : %s vous n'avez pas rentré le bon mot de passe!>\n",x);
 
}
}
 
 
 
j'ai reussi a taper ca mai g un probleme au niveau de l'ouverture des fichier
 
il arrive pas a lire mon fichier
 
merci

Reply

Marsh Posté le 09-01-2006 à 17:55:34   

Reply

Marsh Posté le 09-01-2006 à 20:59:54    

mimou33 a écrit :


#include <stdio.h>
#include <io.h>
 
struct acces {
 char login[10];
 char mdp[10];
};
 
void main()
{
 char x[10],y[10],mot[10];
 struct acces tableau[5];
 short resultat;
 FILE *liste, *test;
 short i=0;
 
 //Lecture des mots de passe dans le fichier
 
 // espion
 if((liste=fopen("H:\\rattrapage\\save1.txt","r" ))==NULL){
  fprintf(stderr,"Probleme d'ouverture\n" );
  exit(1);
 }
 
 while (!feof(liste))
 {
  fscanf(liste,"%s\n",mot);
  printf("%s\n",tableau[i].login);
  scanf("%*c" );
  tableau[i].login=mot;
  fscanf(liste,"%s\n",mot);
  tableau[i].mdp=mot;
  i++;
 }
 
 fclose(liste);
 
 while(1)
 {
  //entrées des données
  printf("Login :\n" );
  scanf("%s%*c",&x);
  printf("Password :\n" );
  scanf("%s%*c",&y);
 
  //Comparaison
 
  //Ecriture des tentatives dans le fichier
  test=fopen("H:\\rattrapage\\save2.txt","w" );
  fprintf(test,"login testé : %s ---- Mot de passe : %s\n",x,y);
  fclose(test);
 
  for(i=0;i<5;i++){
   if(x==tableau[i].login && y==tableau[i].mdp){
   /*Acces autorisé*/
    printf("<Acces autorisé au login : %s>\n",x);
    exit(0);
   }
  }
  /*Acces refusé*/
  printf("<login : %s vous n'avez pas rentré le bon mot de passe!>\n",x);
 }
}



 
Pffouh... beaucoup de lacunes. On va passer du moins important au plus important
 
1) utilises les balises <crochet ouvrant>fixed<crochet fermant>...<crochet ouvrant>/fixed<crochet fermant> ou bien <crochet ouvrant>cpp<crochet fermant>...<crochet ouvrant>/cpp<crochet fermant> pour poster du code => il sera beaucoup plus lisible !!!
 
2) main() est de type "int"
 
3) il est plus conventionnel de nommer une structure "s_qqchose". En nommant ta structure "s_acces", tu conserves le mot clef "acces" libre pour autre chose (définir un tableau de 5 "struct s_acces" par exemple)
 
4) si tu avais découpé ton pgm en tâches élémentaires, chacune d'elle étant dévolue à une fonction précise, ce serait plus facile à déboguer (on teste d'abord la fonction X, puis dès qu' elle fonctionne on passe à la fonction Y, etc)
 
5) si on teste l'ouverture de "liste", il est alors normal de tester aussi l'ouverture de "test" et aussi normal de le fermer après l'avoir écrit (Aristote: "Il est injuste de traiter inégalement de choses égales" )
 
6) Puisque la variable "liste" n'est plus utilisée après sa fermeture, on peut s'en resservir et éliminer la variable "test"
 
7) exit(0) à la fin de l'écriture => horrible. Si un programme se déroule convenablement, on le laisse se dérouler jusqu'à la fin => on assez de structures de contrôles (if, while, for) ou fonctions pour éviter ce genre d'hérésie
 
8) la fonction "feof" ne sert pas à tester la fin d'un fichier. Pour ça on se sert des valeurs renvoyées par les fonctions de lecture (fgets, fread, fgetc ou fscanf). Lorsque la fonction de lecture utilisée ne lit plus, elle renvoie une valeur particulière qu'il suffit de tester pour savoir qu'on a tout lu =>
while (fgets(..., ..., liste) != NULL)
La fonction "feof()" sert juste à indiquer la raison de l'arrêt de la lecture et renvoie vrai si l'arrêt est dû à la fin du fichier (l'arrêt pourrait être dû à autre chose comme une erreur disque par exemple)
 
9) la variable "mot" n'est qu'un pointeur et ne changera jamais de valeur. C'est seulement la case pointée par ce pointeur (et les suivantes) qui seront successivement remplies par les différentes valeurs contenues dans le fichier. Toi tu ne stockes pas les cases pointées dans ton tableau de structures mais simplement le pointeur (toujours le même). Pour copier une chaîne dans une autre, on utilise "strcpy()" et non un bête "="
 
10) idem remarque "9" concernant la comparaison entre "x" et "tableau[i].login". Tu ne compares que des adresses => pour comparer des chaînes => strcmp()
 
11) "x" et "y "étant déjà des pointeurs (des adresses), on ne met pas "&" devant leurs noms dans "scanf" (d'ailleurs t'en n'as pas mis pour "mot" qui est pourtant la même chose que "x" dans "fscanf" => Aristote: "Il est injuste de..." )
 
12) "%*c" signifie que tu veux aussi faire saisir un caractère => admettons (bien que je n'en vois pas l'utilité) mais il faudrait quand-même le stocker quelque part...
 
Voilà, je crois que c'est tout ce qu'il y a (enfin, il y en a tellement que j'en ai sûrement sauté d'autres) mais ce sera déjà pas mal de corriger tout ça...


Message édité par Sve@r le 09-01-2006 à 21:10:56

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 09-01-2006 à 21:34:28    

mimou33 a écrit :

j'ai reussi a taper ca mai g un probleme au niveau de l'ouverture des fichier


Ok, pour un permier jet, il y a de l'idée...
 

  • <io.h> n'est pas standard. Il n'est pas utilisé.
  • manque <stdlib.h> (exit()).
  • main() retourne int. Toujours.
  • feof() ne fait pas ce que tu crois. Il faut tester le code retourné par les fonctions de lecture.
  • L'affectation de chaines se fait avec strcpy() (<string.h> )
  • Lors du chargement, la taille du tableau n'est pas testée. Il y a risque de débordement.
  • A quoi sert le scanf() ?
  • x et y sont des noms sans signification. Préférer login et password, par exemple...
  • La saisie avec scanf() est douteuse. Le paramètre est faux (retirer l'& ). Risque de débordement. Préférer fgets() (quelques précautions à prendre)...
  • Le fichier log devrait être ouvert en mode append ("a" ) au lieu de write ("w" ). (J'ajouterais date et heure...)
  • La condition d'arret de la boucle for doit dependre de ce qui a été lu et d'une constante magique arbitraire.
  • La comparaison de chaines se fait avec strcmp()


A lire : http://mapage.noos.fr/emdel/notes.htm


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed