Précédent   Forum du club des développeurs et IT Pro > C et C++ > C > Débuter
Débuter Forum d'entraide pour débuter en langage C. Avant de poster -> FAQ C
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 25/02/2013, 20h32   #1
jurams
Invité de passage
 
Homme
Lycéen
Inscription : juin 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : juin 2011
Messages : 30
Points : 3
Points : 3
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 :
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.
jurams est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 20h48   #2
Winjerome
Modérateur
 
Avatar de Winjerome
 
Homme Jérôme
Inscription : septembre 2009
Messages : 5 164
Détails du profil
Informations personnelles :
Nom : Homme Jérôme
Âge : 25
Localisation : France, Pyrénées Atlantiques (Aquitaine)

Informations forums :
Inscription : septembre 2009
Messages : 5 164
Points : 12 616
Points : 12 616
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.
Winjerome est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/02/2013, 20h52   #3
Kirilenko
Membre émérite
 
Avatar de Kirilenko
 
Homme Lucas Pesenti
Étudiant
Inscription : décembre 2011
Messages : 234
Détails du profil
Informations personnelles :
Nom : Homme Lucas Pesenti
Âge : 16
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 234
Points : 859
Points : 859
Envoyer un message via MSN à Kirilenko
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
Kirilenko est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 21h01   #4
jurams
Invité de passage
 
Homme
Lycéen
Inscription : juin 2011
Messages : 30
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : juin 2011
Messages : 30
Points : 3
Points : 3
Ok je vais allez lire le tutoriel tout de suite .
Merci à vous pour vos conseils et bonne soirée.
jurams est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h56.


 
 
 
 
Partenaires

Hébergement Web