Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
762 connectés 

  FORUM HardWare.fr
  Programmation
  C

  besoin d'aide

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

besoin d'aide

n°1279031
mimou33
Posté le 08-01-2006 à 12:38:29  profilanswer
 

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

mood
Publicité
Posté le 08-01-2006 à 12:38:29  profilanswer
 

n°1279035
Elmoricq
Modérateur
Posté le 08-01-2006 à 12:44:37  profilanswer
 

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.

n°1279040
mimou33
Posté le 08-01-2006 à 12:49:08  profilanswer
 

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

n°1279043
black_lord
Truth speaks from peacefulness
Posté le 08-01-2006 à 12:51:41  profilanswer
 

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
n°1279045
mimou33
Posté le 08-01-2006 à 12:53:41  profilanswer
 

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

n°1279121
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-01-2006 à 15:04:51  profilanswer
 

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/
n°1279185
mimou33
Posté le 08-01-2006 à 18:30:07  profilanswer
 

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

n°1279189
ritzle
Posté le 08-01-2006 à 18:35:11  profilanswer
 

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

n°1279408
Sve@r
Posté le 09-01-2006 à 03:14:10  profilanswer
 

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.
n°1279731
mimou33
Posté le 09-01-2006 à 17:55:34  profilanswer
 

#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

mood
Publicité
Posté le 09-01-2006 à 17:55:34  profilanswer
 

n°1279932
Sve@r
Posté le 09-01-2006 à 20:59:54  profilanswer
 

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.
n°1279962
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-01-2006 à 21:34:28  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  besoin d'aide

 

Sujets relatifs
Besoin d'aide pour écrire un code VBARUNTIME ERROR BESOIN D'AIDE!
Besoin d'aide VBA ExcelBesoin d'aide, difficile d'expliquer en fait, venez voir
besoin de votre aideproblème langage C besoin d'aide...
besoin d aide pour mon site merciBESOIN D'AIDE AVEC SAXY+PHP5
Besoin d'aide sur setInterval et javascript orienté objet...Mise en place d'une connexion XML-RPC, besoin d'aide
Plus de sujets relatifs à : besoin d'aide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR