Question de logique en C

Fermé
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 - 3 nov. 2009 à 15:27
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 - 8 nov. 2009 à 01:51
Bonjour, je vous donne mon code :
#include <stdio.h>
int main()
{
int nomDePersonnes;
char MotDePasseDavid[] = "abc123";
char MotDePasseJason[] = "salut";
do
{
printf (" PROGRAMME By David Et Jason \n\n");
printf ("1. David \n");
printf ("2. Jason \n");
printf ("0. Fin du programme \n");
printf ("Appuyez sur le chiffre vous concernant \n");
scanf ("%d", &nomDePersonnes);
printf ("\n\n");

switch (nomDePersonnes)
{
case 1:
printf ("vous avez tappez le nombre 1 donc vous vous appelez David \nEntres ton mot de passe pour rentrer dans ta session ?");
scanf ("%s", &MotDePasseDavid);
break;
case 2:
printf ("vous avez tappez le nombre 2 donc vous vous appelez Jason \nEntres ton mot de passe pour rentrer dans ta session ?");
scanf ("%s", &MotDePasseJason);
break;
case 0:
printf ("Fin du programme \n");
break;
default:
printf ("vous n'avez pas tappez de nombre correct alors vous n'avez pas de prenom dans cette liste \n");
break;
}
if (strcmp(MotDePasseDavid,"abc123"))
{
printf ("echec de l'authentification\n");
}
else
printf ("mot de passe correct\n");
}
while(nomDePersonnes != 0);
return 0;
}

ne serait-ce pas mieux de faire ça :
if (strcmp(MotDePasseDavid,"abc123"))
{
printf ("mot de passe corect\n");
}
else
printf ("echec de l'authenrification\n");
}

PLUTOT que ça par simple question de logique ?
if (strcmp(MotDePasseDavid,"abc123"))
{
printf ("echec de l'authentification\n");
}
else
printf ("mot de passe correct\n");
}

14 réponses

loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
3 nov. 2009 à 15:31
La communauté te remercie vivement pour le don de ton code ;-)
En échange, elle te souhaite une très bonne journée.
3
dragondark Messages postés 465 Date d'inscription samedi 23 février 2008 Statut Membre Dernière intervention 27 avril 2016 157
3 nov. 2009 à 15:29
En te remerciant

Cordialement
Dragondark de lonlindil
0
Pilow Messages postés 400 Date d'inscription vendredi 2 octobre 2009 Statut Membre Dernière intervention 23 décembre 2009 71
3 nov. 2009 à 15:32
N'oublie pas d'utiliser des balises codes dans tes messages, ça facilite la lecture

De http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/strcmp.3.html :
Les fonctions strcmp() et strncmp() renvoient un entier inférieur, égal ou supérieur à zéro si s1 (ou ses n premiers octets) est respectivement inférieure, égale ou supérieure à s2. 


Donc if (strcmp(S1, S2) > 0) => Différent, donc pas de bon mot de passe

PS : Un moment que j'ai pas fais de C, je dis peut-être nawak
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
3 nov. 2009 à 15:32
stp si ta une question pose la pas ici jsuis assez emmerder avec mon programme merci !!!!

bon en faite j'ai changé en fesant comme ça :
if (strcmp(MotDePasseDavid,"abc123"))
{
printf ("echec de l'authentification\n");
}
else
printf ("mot de passe correct\n");
et ça marche alors que l'autre bout de code que j'avais mis:
if (strcmp(MotDePasseDavid,"abc123"))
{
printf ("mot de passe correct\n");
}
else
printf ("echec de l'authentification\n");
il fonctionne mal !!!
merci de me dire pourquoi, pour moi sa me semble logique :S
0

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

Posez votre question
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
3 nov. 2009 à 15:34
et je ne connais pas les balises de codes dsl
0
Pilow Messages postés 400 Date d'inscription vendredi 2 octobre 2009 Statut Membre Dernière intervention 23 décembre 2009 71
3 nov. 2009 à 15:37
Les balises de code sont au dessus du champ de texte lorsque tu rédige un message, elle permettent :
d'écrire comme ça


Pour l'explication je l'ai donné dans le message d'avant je pense
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
3 nov. 2009 à 15:39
ok ok comme ça dsl

je n'ai pas compris ton explication =/
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
3 nov. 2009 à 15:44
bon voici j'ai essayer de le terminer :
#include <stdio.h>
int main()
{
    int nomDePersonnes;
    char MotDePasseDavid[] = "abc123";
    char MotDePasseJason[] = "salut";
  do
  {
    printf (" PROGRAMME By David Et Jason \n\n");
    printf ("1. David \n");
    printf ("2. Jason \n");
    printf ("0. Fin du programme \n");
    printf ("Appuyez sur le chiffre vous concernant \n");
    scanf ("%d", &nomDePersonnes);
    printf ("\n\n");

    switch (nomDePersonnes)
    {
        case 1:
        printf ("vous avez tappez le nombre 1 donc vous vous appelez David \nEntres ton mot de passe pour rentrer dans ta session ?");
        scanf ("%s", &MotDePasseDavid);
        break;
        case 2:
        printf ("vous avez tappez le nombre 2 donc vous vous appelez Jason \nEntres ton mot de passe pour rentrer dans ta session ?");
        scanf ("%s", &MotDePasseJason);
        break;
        case 0:
        printf ("Fin du programme \n");
        break;
        default:
        printf ("vous n'avez pas tappez de nombre correct alors vous n'avez pas de prenom dans cette liste \n");
        break;
    }
    if (strcmp(MotDePasseDavid,"abc123")) && (strcmp(MotDePasseJason, "salut"))
    {
        printf ("echec de l'authentification\n");
    }
    else
    {
    printf ("mot de passe correct\n");
    }

  while(nomDePersonnes != 0);
  return 0;
}


je ne comprend si là c'est bon ce que j'ai mi :
  if (strcmp(MotDePasseDavid,"abc123")) && (strcmp(MotDePasseJason, "salut")) 

merci de m'aider
0
Au nom de la communauté française ...
-> vous avez tapé
-> vous n'avez pas tapé

Ensuite :

if (strcmp(MotDePasseDavid,"abc123")) && (strcmp(MotDePasseJason, "salut"))


je verrais plutôt :

if (strcmp(MotDePasseDavid,"abc123")) || (strcmp(MotDePasseJason, "salut"))

car tes 2 utilisateurs ne peuvent pas se connecter en même temps...
Et quitte à être logique :
if (strcmp(MotDePasseDavid,"abc123")) || (strcmp(MotDePasseJason, "salut") == 0) {
         printf ("mot de passe correct\n");
    }
    else
    {
        printf ("echec de l'authentification\n");
    }
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
3 nov. 2009 à 16:22
le programme ne marche pas :/
0
Pilow Messages postés 400 Date d'inscription vendredi 2 octobre 2009 Statut Membre Dernière intervention 23 décembre 2009 71
3 nov. 2009 à 16:26
    char MotDePasseDavid[] = "abc123";
    char MotDePasseJason[] = "salut";


Tu ne donne aucune taille a tes char[] ?

while(nomDePersonnes != 0);
  return 0;


Cette condition marchera pas des masses aussi
0
Bonjour

Ton programme a quelques menus problèmes
. sans un include <string.h> il ne connaît pas la fonction strcmp ( en tous cas pour mon compilateur)
. deux petites fautes de syntaxe : des parenthèses en trop dans
if (strcmp(MotDePasseDavid,"abc123")) && (strcmp(MotDePasseJason, "salut"))
->if (strcmp(MotDePasseDavid,"abc123") && strcmp(MotDePasseJason, "salut"))
qui est bien la bonne condition, quoi qu'en dise blackdam
2 ème faute : il te manque une accolade } avant le while, moyennant quoi il marche très bien car c'est un do { .. } while (condition);

Ensuite le de logique : puisque tu as initialisé tes deux mots de passe aux bonnes valeurs, quand tu en saisis un mauvais, l'autre reste correct. Et quand tu fais le test, tu trouves qu'il y a un des deux corrects. D'ailleurs si tu réponds 1 puis 2 en donnant deux mots de passe faux, il t'indique bien échec de l'authentification.

Enfin, et beaucoup plus grave, tu n'as rien mis pour limiter la longueur des mots de passe. La taille de MotDePasseDavid est déterminée par l'initialisation car tu n'as pas mis de longueur, c'est donc 6 caractères dans ton cas. Si quand tu saisis ce mot de passe, la personne tape plus de 6 caractères, ça va écrire plus loin que prévu dans la mémoire. Là c'est le plantage assuré. Même chose bien sûr pour l'autre mot de passe.

En résumé :
. il ne faut pas initialiser les valeurs des mots de passe, mais les dimensionner en mettant une valeur entre les []
. il faut limiter la taille de la chaine saisie dans le scanf avec %19s au lieu de %s (par exemple, si tu as dimensionné tes chaînes à 20)
. D'ailleurs, à chaque boucle, il faut 'effacer' les deux mots de passe avant la saisie, sinon tu retombes dans le cas des variables déjà initialisées
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
7 nov. 2009 à 21:09
Voilà ce que ça donne :

#include <stdio.h>
#include <string.h>


int main()
{
    int nomDePersonnes;
    char MotDePasseDavid[6] = "abc123";
    char MotDePasseJason[5] = "salut";
do
{
    printf (" PROGRAMME By David Et Jason \n\n");
    printf ("1. David \n");
    printf ("2. Jason \n");
    printf ("0. Fin du programme \n");
    printf ("Identifies toi : \n");
    scanf ("%d", &nomDePersonnes);
    printf ("\n\n");

switch (nomDePersonnes)
{

    case 1:
    printf ("vous avez tappe le nombre 1 donc vous vous appelez David \nEntres ton mot de passe pour rentrer dans ta session ?");
    scanf ("%s", &MotDePasseDavid);
    break;
    case 2:
    printf ("vous avez tappe le nombre 2 donc vous vous appelez Jason \nEntres ton mot de passe pour rentrer dans ta session ?");
    scanf ("%s", &MotDePasseJason);
    break;
    case 0:
    printf ("Fin du programme \n");
    break;
    default:
    printf ("vous n'avez pas tappe de nombre correct alors vous n'etes pas dans cette liste \n");
    break;
}
if (strcmp(MotDePasseDavid,"abc123") && strcmp(MotDePasseJason, "salut"))

    {
         printf ("echec de l'authentification\n");
    }
    else
    {
        printf ("mot de passe correct. \nBienvenue dans votre espace perso \n");
    }
}
while(nomDePersonnes != 0);
return 0;
}


Ce programme fonctionne très bien pour ma part.
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
7 nov. 2009 à 21:13
mais je ne me rappelle plus pourquoi j'ai mi :
while (nomDePersonnes != 0);

et je ne comprend pas non plus là :
if (strcmp(MotDePasseDavid,"abc123") && strcmp(MotDePasseJason, "salut"))

il y a 2 strcmp dans le premier on a mi une parenthèse avant et dans le 2eme on n'en a pas mi avant le strcmp, pourquoi ?
Merci de vos réponses.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
8 nov. 2009 à 01:51
Les parenthèses s'utilisent par paires; il faut lire:
if ( ... )
et ce qui est à l'intérieur comme
condition1 && condition2
En clair, les parenthèses dont tu parles ne sont pas liées aux strcmp.
Bonne continuation.
0
jason-live Messages postés 178 Date d'inscription mardi 1 septembre 2009 Statut Membre Dernière intervention 26 décembre 2009 35
7 nov. 2009 à 22:18
up
0