Classes abstraites, String probleme

Classes abstraites, String probleme - C++ - Programmation

Marsh Posté le 20-04-2005 à 16:27:14    

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
Reply

Marsh Posté le 20-04-2005 à 16:27:14   

Reply

Marsh Posté le 20-04-2005 à 16:36:28    

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

Reply

Marsh Posté le 20-04-2005 à 16:39:41    

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
Reply

Marsh Posté le 20-04-2005 à 16:43:49    

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  :)

Reply

Marsh Posté le 20-04-2005 à 16:45:27    

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:  

Reply

Marsh Posté le 20-04-2005 à 17:04:58    

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

Reply

Marsh Posté le 20-04-2005 à 18:02:58    

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

Reply

Marsh Posté le 20-04-2005 à 18:05:34    

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 :(

Reply

Marsh Posté le 20-04-2005 à 18:16:25    

std::getline pour saisir une ligne

Reply

Marsh Posté le 20-04-2005 à 18:32:14    

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
Reply

Marsh Posté le 20-04-2005 à 18:32:14   

Reply

Marsh Posté le 20-04-2005 à 19:25:50    

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

Reply

Marsh Posté le 20-04-2005 à 21:19:01    

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 ^^

Reply

Marsh Posté le 20-04-2005 à 21:21:47    

heink ? essaie sans le dernier argument pour voir.

Reply

Marsh Posté le 20-04-2005 à 21:28:33    

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"

Reply

Marsh Posté le 20-04-2005 à 21:30:05    

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

Reply

Marsh Posté le 20-04-2005 à 21:34:08    

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

Reply

Marsh Posté le 20-04-2005 à 22:16:35    

la SL de vc++6 est buggée

Reply

Marsh Posté le 20-04-2005 à 22:24:12    

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;

Reply

Marsh Posté le 20-04-2005 à 22:27:03    

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]
Reply

Marsh Posté le 20-04-2005 à 22:40:24    

[:psychokwak]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 20-04-2005 à 22:50:38    

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
Reply

Marsh Posté le 20-04-2005 à 23:20:37    

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;

Reply

Marsh Posté le 20-04-2005 à 23:24:12    

Faut le faire partout. Comment est saisi touche ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-04-2005 à 23:33:42    

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...

Reply

Marsh Posté le 20-04-2005 à 23:34:39    

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

Reply

Marsh Posté le 20-04-2005 à 23:40:39    

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.

Reply

Marsh Posté le 20-04-2005 à 23:46:11    

fais ce que je te dis.

Reply

Marsh Posté le 20-04-2005 à 23:48:06    

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
Reply

Marsh Posté le 21-04-2005 à 08:35:29    

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();

Reply

Marsh Posté le 21-04-2005 à 08:39:05    

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

Reply

Marsh Posté le 21-04-2005 à 09:16:03    

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 ?

Reply

Marsh Posté le 21-04-2005 à 11:01:47    

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
Reply

Marsh Posté le 21-04-2005 à 11:28:39    

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

Reply

Marsh Posté le 21-04-2005 à 11:30:43    

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).

Reply

Marsh Posté le 21-04-2005 à 11:44:30    

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

Reply

Marsh Posté le 21-04-2005 à 12:04:57    

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
Reply

Marsh Posté le 21-04-2005 à 14:33:47    

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:

Reply

Marsh Posté le 21-04-2005 à 17:18:51    

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
Reply

Marsh Posté le 21-04-2005 à 21:29:49    

ben on doit pas lire le français pareil

Reply

Marsh Posté le 21-04-2005 à 22:47:11    

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 !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed