Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 04/06/2019, à 14:29

chris7522

[RESOLU] strcmp (C) je vois pas ou est le probleme ...

Bonjour a toutes et a tous ,
     J'ai beau tourner ca dans tous les sens , je vois pas l'erreur ! Voici le code puis le message d'erreur .
Merci de votre aide .

   

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

  int main()
  {
    char motpasse[]="taco";
    char tabsaisie[15];
    
    printf("Tapez le mot de passe :/n");
    scanf("%s", &tabsaisie);
    if(strcmp(tabsaisie,motpasse)==0)
      puts("mot de passe correct");
    else
      puts("mot de passe incorrect");
    return 0;
  }

   

mlp@mlp:~/Desktop/progrC$ gcc pass.c -o passCompile
pass.c: In function ‘main’:
pass.c:10:13: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[15]’ [-Wformat=]
     scanf("%s", &tabsaisie);
            ~^   ~~~~~~~~~~

Dernière modification par chris7522 (Le 04/06/2019, à 19:08)

Hors ligne

#2 Le 04/06/2019, à 14:41

pingouinux

Re : [RESOLU] strcmp (C) je vois pas ou est le probleme ...

Bonjour,

    printf("Tapez le mot de passe :\n");
    scanf("%s", tabsaisie);

Hors ligne

#3 Le 04/06/2019, à 17:57

chris7522

Re : [RESOLU] strcmp (C) je vois pas ou est le probleme ...

Merci pingouinux . Donc , jamais d'esperluette lorsqu'on fait une scanf d'un tableau ?

Hors ligne

#4 Le 04/06/2019, à 18:41

pingouinux

Re : [RESOLU] strcmp (C) je vois pas ou est le probleme ...

Pour un tableau, le nom correspond à l'adresse, contrairement à une variable ordinaire.

Hors ligne

#5 Le 04/06/2019, à 21:41

Zakhar

Re : [RESOLU] strcmp (C) je vois pas ou est le probleme ...

Houla !

On fait péter ce programme juste en tapant un mot de passe supérieur à 15 caractères...

Attention, le C ne gère pas la mémoire pour toi... tongue

Pour compléter l'affirmation de pingouinux, c'est exact, mais un tableau est un "pointeur constant". C'est à dire qu'il correspond à un endroit fixe de la mémoire, et tu ne peux pas le changer.

Exemples :


#include <stdio.h>

static const char passwd[] = "taco";
static const char passwd2[] = "cota";
static const char *p = passwd;


int main ()
{
        printf("%s\n", passwd);
        printf("%s\n", p);

        p = passwd2;
//      passwd = passwd2;       That does NOT work!
        printf("%s\n", p);
}

Comme tu le vois, aussi bien "p" que "passwd" sont des pointeurs que l'ont peut par exemple passer dans un printf.
Par contre on peut affecter une valeur à "p" qui est bien un pointeur, mais pas à "passwd" qui est une constante.

Le "const" dans la déclaration ne se réfère pas au pointeurs, mais aux caractères qui sont constants. Il disent au compilateur que personne ne remplacera jamais la chaîne "taco" de passwd par d'autres caractères, et cela permet au compilateur de faire des optimisation sympathiques, comme placer ces données là dans le segment des données immutables et plein d'autres raccourcis qui deviennent possibles quand le compilateur sait cela.

"static" sert à dire au compilateur que cette variable est utilisée uniquement dans ce source là, et qu'il n'y a pas besoin de l'exporter pour le "linker". D'autres optimisations sont alors possibles. Attention cependant, une variable statique est globale au source, même si elle est définie dans une fonction. C'est source d'erreur difficile à trouver si on fait du multi-thread.
C'est pourquoi je l'ai mise exprès en dehors du "main" pour bien que ce soit clair qu'elle est globale, et pas limitée au scope d'une fonction.

Il faut imaginer ça :

Adresse mémoire constante (passwd) [taco\0]   <<===  Adresse mémoire (p) [Pointeur sur passwd]

Donc le "p" prendra 8 octets (assuming 64bits), plus la chaîne de caractères pointée pour être utile.

Bon courage !

Dernière modification par Zakhar (Le 04/06/2019, à 21:43)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne