2009-11-15 9 views
1

J'essaie d'obtenir une ligne en entrée de la ligne de commande. Mon problème est que je n'obtiens pas toute la ligne, mais il est atomisé par l'espace.C++ personnalisation de chaîne de caractères

Donc, si je suis entré dans quelque chose comme «J'aime Math beaucoup » au lieu d'obtenir

"you enterend: I like Math a lot" 

je suis le follwoing:

EDITING MODE: Enter a command 
i like Math a lot 
you entered i 

EDITING MODE: Enter a command 
you entered like 

EDITING MODE: Enter a command 
you entered Math 

EDITING MODE: Enter a command 
you entered a 

EDITING MODE: Enter a command 
you entered lot 


void enterEditingMode(){ 
    editingMode = TRUE; 
    static string CMD = "\nEDITING MODE: Enter a command\n"; 
    string input; 
    while(editingMode == TRUE){ 
     cout << CMD; 
     cin >> input; 
     //we assume input is always correct 
     // here we need to parse the instruction 
     cout << "you entered " << input <<endl; 

Répondre

12

std::getline est le moyen standard pour lire une ligne de entrée à la fois.

Vous pouvez l'utiliser comme ceci:

std::getline(std::cin, string); 

Il renvoie une référence au flux d'entrée qui a une conversion implicite void* donc vous pouvez vérifier le succès facilement comme ceci:

if (std::getline(std::cin, string)) 
{ 
    // successfully read a line... 
} 
+1

Et n'oubliez pas la version de cin.getline (char *, int) si vous voulez saisir une chaîne c. –

+0

Il n'a pas de conversion explicite en void *. Il a une conversion explicite en un type non spécifié qui est utilisable dans un contexte booléen. Il se peut que cela soit nul * dans votre implémentation, mais cela peut ne pas s'appliquer à tous. Et c'est beaucoup plus facile d'expliquer aux débutants que le résultat est convertible en quelque chose qui agit comme un booléen. –

+0

En fait, 'opérateur void *' est requis par la norme. Cela fait partie de l'interface de la classe de base 'basic_ios'. –

1

cin.getline(input);

Voir http://www.cplusplus.com/reference/iostream/istream/getline/ pour plus d'informations.

+0

Les fonctions membres 'istream' appelées' getline' prennent toutes des tampons 'char' et une longueur, pas une' chaîne'. –

+0

Je l'ai déjà essayé, le problème est que puisque le code est dans une boucle while, il lit d'abord le nouveau caractère de ligne. Donc je reçois toujours "tu es entré" quand je n'entre même pas. – user69514