1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    juin 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : juin 2011
    Messages : 39
    Points : 14
    Points
    14

    Par défaut Problème chaine de caractère

    Bonsoir, cela fait déjà pas mal de temps que je code en C par passion mais là je ne comprend pas ce qu'il se passe, je m'explique. En ce moment je suis sur la gestion des chaines de caractère et donc j'ai un problème avec une condition qui passe 'inaperçut' dans mon programme :
    Dans tous les cas le if n'est pas pris en compte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
        char CHbonjour[] = "";
        printf("Bonjour !\n");
        scanf("%s", CHbonjour);
     
        printf("vous avez saisi : '%s'\n", CHbonjour);
     
        if(CHbonjour=="bonjour")
        {
            printf("comment vas tu ? :)");
        }
     
        return 0;
    }
    Dans tous les cas le if n'est pas pris en compte...
    Je pense que j'ai du pas faire attention à quelque chose, mais quoi ?
    Quelqu'un serait d'où vient mon problème ?
    Cordialement Jurams.

  2. #2
    Expert éminent sénior

    Avatar de Winjerome
    Homme Profil pro
    Inscrit en
    septembre 2009
    Messages
    8 893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : septembre 2009
    Messages : 8 893
    Points : 32 724
    Points
    32 724

    Par défaut

    Bonjour,

    Il y a trois problèmes dans ton code :
    1. sans taille entre les crochets, celle-ci va être déduite de la partie droite. Ici "" (='\0') donc seulement 1 caractère. Il y aura donc de très fortes chances de dépassement.
    2. Ensuite : CHbonjour=="bonjour" on ne compare pas des chaînes de caractères avec l'opérateur == mais avec la fonction strcmp FAQ Comment comparer 2 chaînes de caractères ?
    3. scanf("%s", CHbonjour); si tenté que tu aies réglé le premier point, tu auras toujours des chances de dépassement si tu saisis plus de caractères que ne peut stocker CHbonjour. Je te conseille la lecture de ce tutotiel.
    Avant de poser votre question : FAQ, Tutoriels et recherche sur le forum
    Une erreur ? Messages d'erreur et avertissements
    "Ça ne marche pas" n'apporte aucune information utile permettant de vous aider. Expliquez clairement votre problème (erreurs entières, résultat souhaité vs obtenu...).

    En essayant continuellement on finit par réussir. Donc: plus ça rate, plus on a de chance que ça marche. - Jacques Rouxel
    L'expérience, c'est le nom que chacun donne à ses erreurs - Oscar Wilde
    Ma version améliorée de FireDVP et son homologue ChroDVP pour Chrome.

  3. #3
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 19
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2011
    Messages : 234
    Points : 810
    Points
    810

    Par défaut

    Bonsoir,

    Le problème est que, par définition, lorsqu'une expression du type tableau n'est ni l'opérande de l'opérateur sizeof, ni de _Alignof, ni de l'opérateur unaire &, ni une chaîne littérale utilisée pour initialiser un tableau, elle est convertie en un pointeur sur le premier élément de l'objet tableau, et n'est pas une lvalue [§ 6.3.2]. De ce fait, sur une machine conventionnelle, CHbonjour désigne l'adresse du premier élément de la chaîne, et "bonjour" l'adresse d'une chaîne de caractère anonyme, située généralement quelque part dans une zone mémoire en lecture seule (correspondant parfois au segment .rodata). Tu vas donc comparer ces deux pointeurs, ce qui ne mènera évidemment à rien (et le comportement est indéfini du fait de la comparaison de deux pointeurs issus d'agrégats de données différents [§ 6.5.8]). La solution est d'effectuer une comparaison caractère par caractère, en utilisant la fonction standard strcmp par exemple [§ 7.24.4.2].

    Un deuxième problème est que tu ne spécifies pas la taille de ta chaîne lors de sa déclaration ; elle prendra donc la taille de la chaîne littérale "", c'est-à-dire un caractère, ce qui ne sera pas suffisant pour stocker l'entièreté de l'entrée de l'utilisateur. Tu vas donc, à coup sûr, te retrouver avec des accès mémoires invalides qui conduisent à nouveau à un comportement indéfini. Tu noteras de plus que la fonction scanf est davantage adaptée à la lecture de flux formatés [§ 7.21.6.4], ce qui n'est pas le cas des entrées humaines. La fonction standard fgets sera sans doute meilleure [§ 7.21.7.2].

    Bonne soirée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    juin 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : juin 2011
    Messages : 39
    Points : 14
    Points
    14

    Par défaut

    Ok je vais allez lire le tutoriel tout de suite .
    Merci à vous pour vos conseils et bonne soirée.

Discussions similaires

  1. Probléme chaine de caractéres
    Par kiooik dans le forum Débuter
    Réponses: 2
    Dernier message: 30/07/2008, 16h25
  2. Problème chaine de caractère sous vista
    Par pinguipacman dans le forum Visual C++
    Réponses: 1
    Dernier message: 22/02/2008, 16h34
  3. [Débutant]Problème chaine de caractères
    Par olivier1209 dans le forum AWT/SWING
    Réponses: 16
    Dernier message: 04/05/2007, 10h10
  4. [Format]Problème chaine de caractère
    Par e040098k dans le forum Access
    Réponses: 4
    Dernier message: 16/04/2007, 22h17
  5. problème chaine de caractère
    Par fabpeden dans le forum C
    Réponses: 6
    Dernier message: 26/03/2007, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo