Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1239 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Classes abstraites, String probleme

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Classes abstraites, String probleme

n°1053792
Pookie
Posté le 20-04-2005 à 16:27:14  profilanswer
 

Bonjour,
Je suis en 1ere année de BTS info.
J'ai un projet a realiser pendant ces vancances : une bibliotheque.
J ai un ptit probleme lors de l utilisation de "string". (lors de la saisie de texte)
 
si je declare une string comme :
 
string titre;
cin >> string;
 
Je ne peux pas taper d'espace (donc pour un titre c est genant).
 
pareil avec la commande :
getline (cin, titre);
qui me fait un peu tout bugger (il prend le caractere espace comme une fin de saisie).
 
Comme c'est assez difficile d expliquer, j ai uppé mon projet :  
http://thibault33.free.fr/Dossier% [...] theque.rar
 
il n'est pas totalement fini (manque de commentaires)
Si vous voyez comment resoudre se probleme :)
merci d avance.
 
code ou ca ne va pas :

Code :
  1. cout << "Auteur : ";
  2.   cin >> auteur;
  3.   //getline(cin, auteur);
  4.  
  5.   cout << "Titre : ";
  6.   cin >> titre;
  7.   //getline(cin,titre);


Message édité par Pookie le 20-04-2005 à 16:38:43
mood
Publicité
Posté le 20-04-2005 à 16:27:14  profilanswer
 

n°1053812
Sebou77
French Tech powaa :-)
Posté le 20-04-2005 à 16:36:28  profilanswer
 

Il doit y avoir une soluce, mais sinon utilise scanf tout bêtement.

n°1053821
Pookie
Posté le 20-04-2005 à 16:39:41  profilanswer
 

je viens de tester la fonction
mais il lui faut un char* et non un string
j ai pas envie de changer tous mes string en char* :)


Message édité par Pookie le 20-04-2005 à 16:43:31
n°1053842
Sebou77
French Tech powaa :-)
Posté le 20-04-2005 à 16:43:49  profilanswer
 

Donc tu n'a jamais de C, c'est dommage.
Très simple, syntaxe:

Code :
  1. string titre;
  2. ...
  3. scanf("%s", titre);


Si tu veux plus de détail prends n'importe quel cours sur le C tu trouveras plein d'explication  :)

n°1053848
Sebou77
French Tech powaa :-)
Posté le 20-04-2005 à 16:45:27  profilanswer
 

Pookie a écrit :

je viens de tester la fonction
mais il lui faut un char* et non un string
j ai pas envie de changer tous mes string en char* :)


 
Arf dommage, il doit y avoir d'autre soluce mais perso je ne m'y connait pas assé en C++ pour ça  :wahoo:  

n°1053917
skelter
Posté le 20-04-2005 à 17:04:58  profilanswer
 

meme en C tu ne t'y connais pas, ta soluce est buggée

n°1054009
Sebou77
French Tech powaa :-)
Posté le 20-04-2005 à 18:02:58  profilanswer
 

skelter a écrit :

meme en C tu ne t'y connais pas, ta soluce est buggée


étant donné que c'est du C++ que je pensé faire et non du C forcément ça marche pas en C  :sarcastic:  
Je sais que scanf fonctionne en C++ mais je savais pas qu'il prenait pas les string

n°1054011
Pookie
Posté le 20-04-2005 à 18:05:34  profilanswer
 

je pensais qu on pouvais utiliser la fonction cin pour remplir le contenu d'un string.
Il doit surement exister une autre fonction.
mais je n'ai pas la msdn sous la main :(

n°1054027
skelter
Posté le 20-04-2005 à 18:16:25  profilanswer
 

std::getline pour saisir une ligne

n°1054044
HelloWorld
Salut tout le monde!
Posté le 20-04-2005 à 18:32:14  profilanswer
 

Citation :


pareil avec la commande :  
getline (cin, titre);  
qui me fait un peu tout bugger (il prend le caractere espace comme une fin de saisie)


et pourtant ça devrait être bon. Tu dois avoir une histoire de '\n' qui traine, à cause de cin utilisé directement.
N'utilise que getline() et analyse la ligne obtenue avec un istringstream, ou bien avant chaque getline() fait un cin.ignore().


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
mood
Publicité
Posté le 20-04-2005 à 18:32:14  profilanswer
 

n°1054126
Taz
bisounours-codeur
Posté le 20-04-2005 à 19:25:50  profilanswer
 

NON METS JE REVE OU QUOI ?  
 
faut attendre 10 postes pour que quelqu'un sorte enfin std::getline !

n°1054321
Pookie
Posté le 20-04-2005 à 21:19:01  profilanswer
 

non se n'est pas ca.
j utilise un :using namespace std;
 
je crois savoir d ou vient le probleme.
donc : std::getline(cin, variable, '\n');
il detecte mal le retour a la ligne et fait planté le programme.
alors que : std::getline(cin, variable, '.'); (donc je termine ma saisie par un point) marche tres bien.
 
 
je sens que jvais virer ces string ^^

n°1054324
Taz
bisounours-codeur
Posté le 20-04-2005 à 21:21:47  profilanswer
 

heink ? essaie sans le dernier argument pour voir.

n°1054335
Pookie
Posté le 20-04-2005 à 21:28:33  profilanswer
 

sans le dernier argument, je ne peux pas rentrer d espace dans ma saisie.
Il y a peu etre un autre probleme dans mon code.
Si vous pouviez y jeterun ptit coup d oeil, le probleme se trouve dans le fichier "bibliotheque.cpp"

n°1054338
Taz
bisounours-codeur
Posté le 20-04-2005 à 21:30:05  profilanswer
 

mais bien sur que si !
faut arrêter la drogue.
 
std::getline marche niquel
 
fais un test
 
if(!std::getline(std::cin, ligne)) { erreur }

n°1054350
Pookie
Posté le 20-04-2005 à 21:34:08  profilanswer
 

donc je dois avoir une autre erreur quelques part :(
peu etre que mon VC6 bug ^^
jvais regarder ca de plus pret

n°1054414
skelter
Posté le 20-04-2005 à 22:16:35  profilanswer
 

la SL de vc++6 est buggée

n°1054423
Pookie
Posté le 20-04-2005 à 22:24:12  profilanswer
 

Code :
  1. string auteur;
  2.   string titre;
  3.   cout << "Titre : ";
  4.   std::getline(std::cin,titre);
  5.   cout << "Auteur : ";
  6.   std::getline(std::cin,auteur);
  7.   switch (touche)
  8.   {
  9.     case 1 : {
  10.                 unsigned nombrePages;
  11.                 cout << "Nombre de pages : ";
  12.  std::cin >> nombrePages;
  13.  documents.push_back(new Livre(auteur, titre, nombrePages));
  14.              }
  15.             break;


 
avec le debugger pas a pas, je remarque que le programme prend bien les getline, puis rentre dans dans le switch et la il saute carrement le cin>>nombrePages;

n°1054427
WhatDe
Posté le 20-04-2005 à 22:27:03  profilanswer
 

Sebou77 a écrit :

Donc tu n'a jamais de C, c'est dommage.
Très simple, syntaxe:

Code :
  1. string titre;
  2. ...
  3. scanf("%s", titre);


Si tu veux plus de détail prends n'importe quel cours sur le C tu trouveras plein d'explication  :)


 [:petrus75]


---------------
[:whatde]
n°1054445
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-04-2005 à 22:40:24  profilanswer
 

[:psychokwak]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1054455
HelloWorld
Salut tout le monde!
Posté le 20-04-2005 à 22:50:38  profilanswer
 

C'es tes cin directs qui fouttent la merde, dans le style:

Code :
  1. std::cin >> nombrePages;


Comme je te l'ai dit:

Citation :

Tu dois avoir une histoire de '\n' qui traine, à cause de cin utilisé directement.  
N'utilise que getline() et analyse la ligne obtenue avec un istringstream, ou bien avant chaque getline() fait un cin.ignore().


Donc on reprend, soit tu modifies tes cin directs ainsi:

Code :
  1. string line;
  2. getline( cin, line );
  3. istringstream iss( line );
  4. iss >> nombrePages;


soit tu vides avant les getline / après les cin:

Code :
  1. cin.ignore( numeric_limits<streamsize>::max(), '\n' );
  2. getline(cin, titre);


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1054523
Pookie
Posté le 20-04-2005 à 23:20:37  profilanswer
 

je ne connais pas trop ces methodes, mais j ai essayé de les appliquer. Ca marche a peu pret ^^ (c deja pas mal) (methode 1)
 
mais il y a 1 ptits problemes :
dans mon code je dois rentrer : l auteur, le titre et le nombre de pages.
j utilse un push_back, mais le titre reste une chaine nulle et le nombres de pages prensd nimporte kelle valeur.
 
desoler je debute :)
 

Code :
  1. string auteur;
  2.   string titre;
  3.   cout << "Auteur : ";
  4.   std::getline(std::cin,auteur);
  5.   cout << "Titre : ";
  6.   std::getline(std::cin,titre);
  7.   switch (touche)
  8.   {
  9.     case 1 : {
  10.                 unsigned nombrePages;
  11.    string line;
  12.                 cout << "Nombre de pages : ";
  13.    getline( cin, line );
  14.    istringstream iss( line );
  15.    iss >> nombrePages;
  16.    documents.push_back(new Livre(titre, auteur, nombrePages));
  17.              }
  18.             break;

n°1054533
HelloWorld
Salut tout le monde!
Posté le 20-04-2005 à 23:24:12  profilanswer
 

Faut le faire partout. Comment est saisi touche ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1054557
Tarabiscot​e
Posté le 20-04-2005 à 23:33:42  profilanswer
 

C'est presque à se demander si son getline n’est pas buggé...
Remarque c'est possible s'il utilise une version du compilateur de microsoft qui date un peu...

n°1054561
Taz
bisounours-codeur
Posté le 20-04-2005 à 23:34:39  profilanswer
 

moi je voudrais que vous commenciez a vérifier TOUS les codes de retours des fonctions.

n°1054570
Tarabiscot​e
Posté le 20-04-2005 à 23:40:39  profilanswer
 

C'est vrai que ça serait bien mais ça n'explique pas pourquoi ça marche pas en tapant ce qu'il faut (enfin je suppose que c'est ce qu'il fait).
Bien sûr si on lui donne pas ce qu'il attend c'est normal que ça fasse ça.

n°1054574
Taz
bisounours-codeur
Posté le 20-04-2005 à 23:46:11  profilanswer
 

fais ce que je te dis.

n°1054579
Pookie
Posté le 20-04-2005 à 23:48:06  profilanswer
 

vous avez tout mon code source
fichier bibliotheque.cpp principalement
 
mon VC6 est a jour et je pense que le reste de mes fonctions sont bonnes (puisqu avec des cin tous simple, en ne rentrant pas d espace ,ca marche)
 
il doit y avoir une ptite erreur que je n arrive pas a voir apres 8h de code :)
 
edit : le code dispo sur mon ftp n est pas modifié avec les redirections.


Message édité par Pookie le 20-04-2005 à 23:52:37
n°1054777
Tarabiscot​e
Posté le 21-04-2005 à 08:35:29  profilanswer
 

C'est bon j'ai trouvé le problème, c'est bien getline qui est buggé avec VC6 :)
 
Fais la correction proposé ici :
http://support.microsoft.com/defau [...] -us;240015
 
Et rajoute ça avant le 1er getline :
cin.sync();

n°1054782
Taz
bisounours-codeur
Posté le 21-04-2005 à 08:39:05  profilanswer
 

quelle merde ...
ça pue d'avoir un OS avec une lib C++ bugguée jusqu'à l'os

n°1054819
++fab
victime du syndrome IH
Posté le 21-04-2005 à 09:16:03  profilanswer
 

sachant que getline est quand meme une des fonctions les plus utilisés en C++, ça me fait frémir ce bug. Y a pas un smiley avec VC6 interdit ou du genre ?

n°1054918
HelloWorld
Salut tout le monde!
Posté le 21-04-2005 à 11:01:47  profilanswer
 

Taz a écrit :

quelle merde ...
ça pue d'avoir un OS avec une lib C++ bugguée jusqu'à l'os


Revoie tes bases, l'OS n'a rien à voir là dedans.

Citation :

Et rajoute ça avant le 1er getline :  
cin.sync();


je crois que le comportement de cin.sync() n'est pas normalisé, ça dépend des implémentations / OS.
Mieux vaut faire un ignore(), un peu comme je le dit depuis le début.  :ange:  
Faudrait vérifier les valeurs saisies aussi, notamment au niveau de la conversion en entier.

Code :
  1. if ( !( iss >> nombrePages ) )
  2. {
  3.     cerr << "Erreur de saisie\n";
  4. }


Pour en revenir au bug, je suis pas sûr qu'il soit la cause du problème, surtout s'il a le dernier SP de VC++. Et s'il est bien en cause, c'est un argument de plus pour dire de passer à quelque chose de plus récent qu'un compilo qui a 7 ans.
Mais même sur un compilo non buggé, le code suivant va merder:

Code :
  1. cout << "Entrez un choix : ";
  2. int touche;
  3. cin >> touche;
  4. if ( touche == 1 )
  5. {
  6.     cout << "Auteur : ";
  7.     string auteur;
  8.     getline(cin,auteur);
  9.     cout << "Titre : ";
  10.     string titre;
  11.     getline(cin,titre);
  12.     unsigned nombrePages;
  13.     string line;
  14.     cout << "Nombre de pages : ";
  15.     getline( cin, line );
  16.     istringstream iss( line );
  17.     iss >> nombrePages;
  18.     cout << "Vous avez entré : "
  19.          << auteur << '\t'
  20.          << titre << '\t'
  21.          << nombrePages << '\n';
  22. }


a condition de renter 1, l'auteur sera vide.


Message édité par HelloWorld le 21-04-2005 à 11:02:10

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1054966
Taz
bisounours-codeur
Posté le 21-04-2005 à 11:28:39  profilanswer
 

HelloWorld a écrit :

Revoie tes bases, l'OS n'a rien à voir là dedans.

heink ? ou j'ai dit que c'était l'OS ?
 
cin, cerr, clog sont .tie()'és à cout, c'est standardisé, il n'y a pas besoin de sync()'er quoi que ce soit

n°1054973
Tarabiscot​e
Posté le 21-04-2005 à 11:30:43  profilanswer
 

Pour le cin.sync, c'est vrai que ça ne doit pas être normalisé.
C'est juste que j'aime pas trop la bidouille avec le ignore.
 
En ce qui concerne VC6, je viens de remarqué que j'avais que le SP5  :sweat: (dsl mais je l'utilise presque jamais).
Je vais vérifier avec le SP6, mais sinon chez moi ça cause bien le problème.
 
D'ailleurs impossible de reproduire le même problème après avoir fait la correction sur le site donc pookie n'a peut-être pas la dernière version ou alors elle est buggée aussi (je vais tester mais ça télécharge pas vite).

n°1054998
++fab
victime du syndrome IH
Posté le 21-04-2005 à 11:44:30  profilanswer
 

le coup du ignore, c'est pas de la bidouille, et c'est une bonne façon de faire. Voir le BS.

n°1055022
Pookie
Posté le 21-04-2005 à 12:04:57  profilanswer
 

ca marche je vous remercie tous :)
avec un cin.sync();
 
Bon maintenant je n ai plus qu a detecter les erreurs et j aurai fini.
 
Je vous remercie encore
bonne journée
 
edit : vous utilisez quel compilateur ? car moi j utilise vc6 car on l utilise en cours.
J aurai pu aussi le faire en VC7 ou avec une plateforme java (ca aurai ete plus simple pour les getline ...)
+


Message édité par Pookie le 21-04-2005 à 12:06:03
n°1055187
++fab
victime du syndrome IH
Posté le 21-04-2005 à 14:33:47  profilanswer
 

Taz a écrit :

cin, cerr, clog sont .tie()'és à cout, c'est standardisé, il n'y a pas besoin de sync()'er quoi que ce soit


 
c'est Taz qui a écrit ça ?  :sweat:

n°1055442
HelloWorld
Salut tout le monde!
Posté le 21-04-2005 à 17:18:51  profilanswer
 

Taz a écrit :

heink ? ou j'ai dit que c'était l'OS ?


juste avant:

Citation :

ça pue d'avoir un OS avec une lib C++ bugguée jusqu'à l'os


Citation :

Pour le cin.sync, c'est vrai que ça ne doit pas être normalisé.  
C'est juste que j'aime pas trop la bidouille avec le ignore.


cin.sync(), c'est grosso modo équivalent à fflush(stdin) en C.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1055750
Taz
bisounours-codeur
Posté le 21-04-2005 à 21:29:49  profilanswer
 

ben on doit pas lire le français pareil

n°1055897
++fab
victime du syndrome IH
Posté le 21-04-2005 à 22:47:11  profilanswer
 

Citation :

cin est .tie()'é à cout, pas cerr ni clog. C'est standardisé, il n'y a pas besoin de "flusher" quoi que ce soit pour cin <-> cout (encore moins .sync()er  :??: )


 
l'apéro bordel !

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Classes abstraites, String probleme

 

Sujets relatifs
Problème Javascript InnerHTML avec firefoxProbléme avec des variables globales
Problème pour executer lotus sur le poste clientProbleme de récupération de données de formulaire
[CSS]Problème sur des <li> en inline.Probleme mail phpbb sur compte free
Déclaration d'un stringProblème avec clone !!!
[C#]Probleme de données entre Formprobleme avec frame
Plus de sujets relatifs à : Classes abstraites, String probleme


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR