IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Pb saisie du char*


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut Pb saisie du char*
    Salut tout le monde,

    J'ai un probleme de saisie lorsque j'ai des char*...
    En effet je ne sais pas comment faire un cin d'un char* parce que quand je le fais ca plante...
    Comme par ex:

    char* nom;
    cin>>nom;

    La ca plante...
    Est ce que quelqu'un pourrait me dire comment faire ?
    Merci d'avance
    stan314

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    pense aux balises code la prochaine fois

    en C++, pour manipuler les chaînes de caractères, utilise plutôt les string (tu trouveras de nombreux tutos dans la rubrique adéquate de ce site )

    De plus, en faisant saisire une chaîne de caractère (que ce soit un char* ou un string), garde à l'esprit que le texte sera coupé après le premier espace (tu ne récupérera pas ce qu'il y a après le premier espace, si tu veux une ligne en entier, il vaut mieux te tourner vers getline )

    sinon, pour le problème actuel, c'est parce que tu n'alloue ton char*, c'est à dire que tu déclares un pointeur, mais sans lui réserver, d'espace mémoire...

    tu as deux choix : demander une taille fixe de mémoire, en changeant la déclaration : par exemple, oublie pas qu'il faut le nombre de caractères attendus + 1

    soit faire une allocation dynamique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* nom = new char[100];
    ici aussi, pense au nombre de caractère + 1...

    mais dans ce cas, il te faudra penser à faire un pour libérer l'espace mémoire demander...

    au fait, tout ceci fait réellement partie des bases en C//C++...

    Il vaudrait peut-être mieux que tu lises un petit tuto
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ton pointeur pointe nulle part, il faut allouer de la mémoire avant de saisir quoique ce soit dans ta chaîne (ce qui implique notamment de connaître la longueur de la chaîne à l'avance).

    Mais les char* c'est mal en C++

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <string>
     
    std::string chaine;
    std::cin >> chaine;
    Voir la FAQ C++ pour plus de détails.

  4. #4
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Il faut déclarer la chaine ainsi:
    Mais comme cela a été dit en C++ les string sont mieux même si plus lentes.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Laurent Gomila
    Mais les char* c'est mal en C++
    Voila un position très dogmatique! Les char *, c'est pas plus mal qu'autre chose si on sait s'en servir et si on s'en sert à bon escient. Les string ne sont pas par axiome une nécessité absolue .
    Swoög
    sinon, pour le problème actuel, c'est parce que tu n'alloue ton char*, c'est à dire que tu déclares un pointeur, mais sans lui réserver, d'espace mémoire...
    Soyons plus précis dans nos affirmations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char* nom;
    cin>>nom;
    Le char * (autrement dit nom) est parfaitement alloué et l'espace mémoire nécessaire est bien réservé pour ce char *. Ce qui n'est pas correct, c'est que nom a pour vocation de contenir l'adresse d'une zone mémoire dédiée au stockage d'un ou plusieurs char , que cette zone mémoire (pour stocker les char) n'est pas allouée et que nom n'est pas initialisé avec cette hypothétique zone mémoire.
    Pour allouer cette zone, Swoög propose qq possibilités qui résoudront le problème.

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Les char* sont à éviter dans ce cas, les string proposent tout ce qu'on serait obligé de faire à côté pour lire sur cin, et plus encore. Et quand on a des arguments pour ne pas utiliser string, on devrait utiliser vector<char>. Resource Acquisition Is Initialization.

  7. #7
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    diogene : tout d'abord excuse moi pour ce léger écart de langage, il est vrai que je me suis imparfaitement exprimé.
    Cependant, permet-mio de te dire que pour quelqu'un qui est aussi précis, tu me semble en même temps très permissif !

    Les string de la STL C++ sont parfaitement portables et standards, ils permettent de se séparer de syntaxe lourdes et peu claires, ainsi que de se détacher de l'allocation mémoire, En outre, ils sont certainement étés optimisés au maximum par des personnes qui ont infiniment plus de connaissances et d'expériences que toi ou moi en la matière, je te met au défi de dire le contraire (et de le prouver)

    Ils font parties des Différences Majeures entre le C et le C++ (qui sont deux langages différents ne l'oubliont pas !)
    si pour des raisons de compatibilté (et d'utilité dans certains cas bien précis) les pointeurs ont été conservés en C++, ce n'est pas une raison pour les utiliser à tort et à travers : certe savoir les utiliser et un atout. Mais comme tu le dis toi même, il faut les utiliser à bonne escient... et soit dit en passant, je pense qu'utiliser des pointeurs sur des types de base en C++ ne se fait jamais à bonne escient, il y a les références et les conteneurs standards pour les remplacer.
    Cependant, dans un cas aussi simple que celui-ci, je pense qu'on peut dire : les char* c'est mal.

    en effet, pourquoi utiliser des pratiques dépréciées et plantogènes alors qu'il existent des pattern optimisés et sûrs ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Voila un position très dogmatique! Les char *, c'est pas plus mal qu'autre chose si on sait s'en servir et si on s'en sert à bon escient. Les string ne sont pas par axiome une nécessité absolue .
    J'ai rarement (jamais) vu un cas où un char* était préférable un std::string. Le fait est que la classe de chaînes de caractères en C++ est std::string, tout comme les tableux dynamiques sont std::vector.

Discussions similaires

  1. Saisie de nombres dans un tableau de char
    Par Lyons dans le forum Débuter
    Réponses: 4
    Dernier message: 31/08/2013, 00h43
  2. echec de saisie d'un char*
    Par prince_bouja dans le forum Débuter
    Réponses: 1
    Dernier message: 14/06/2010, 23h10
  3. Problème boucle et saisie de char
    Par Setsuna_00 dans le forum Débuter
    Réponses: 5
    Dernier message: 09/04/2010, 18h50
  4. saisie d'un char
    Par john123 dans le forum C
    Réponses: 13
    Dernier message: 20/11/2005, 20h46
  5. [Kylix] crypter la saisie sous kylix
    Par nahmsath dans le forum EDI
    Réponses: 2
    Dernier message: 15/10/2002, 13h16

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