2010-05-05 17 views
1

Je suis un peu confus par les résultats de la fonction suivante:fonctionnalité de cin en C++

int main() { 
string command; 
while(1) { 
    cin >> command; 

    if(command == "end") 
      return 0; 
    else 
      cout << "Could you repeat the command?" << endl; 
} 

return 0; 

}

tout d'abord - la ligne de sortie (« pourriez-vous ... ») répète une fois pour chaque mot individuel dans l'entrée (stocké dans la commande). Pour autant que je puisse voir, il devrait seulement être possible que cela se produise une fois pour chaque instance de la boucle.

De même, lorsque la ligne 'if (commande == "end")' est remplacée par 'if (commande == "c'est-à-dire") ", elle ne se déclenche jamais. Un petit test a suggéré que tout l'espace blanc a été retiré de la commande.

Quelqu'un pourrait m'expliquer ce qui se passe ici?

Merci

+1

Woah. Tant de choses. La première chose est que vous voulez utiliser getline http://www.cplusplus.com/reference/string/getline/ puisque tout espace est le délimiteur par défaut lors de la lecture d'un iostream. –

+3

Vous remarquerez également que lorsque vous faites une chaîne (constante) == "constante", vous forcez la chaîne constante dans un objet chaîne. Si jamais vous avez une chaîne C (comme appeler command.c_str()), vous voulez utiliser strcmp() pour comparer les chaînes pour l'égalité, pas ==, car == comparerait normalement les adresses des chaînes référencées. –

+0

@Compiluous Compiler - Ces 2 commentaires font la meilleure réponse, vous devriez posté +1 sur vos commentaires. Testant particulièrement les chaînes avec ==. – JonH

Répondre

5

L'opérateur d'entrée formaté >>() lit des jetons séparés par des espaces d'entrée. Si vous voulez lire des lignes entières, utilisez la fonction getline():

string command; 
getline(cin, command); 
+0

Merci, cela fonctionne parfaitement. Par curiosité, à quoi se réfère le 'cin' dans la fonction getline? Quels paramètres de substitution pourraient prendre getline pour le premier argument? – wyatt

+1

N'importe quel flux d'entrée que vous aimez. Il pourrait s'agir de données en mémoire, d'une base de données, d'une connexion réseau quelconque. il existe également une fonction membre cin.getline() –

+0

@wyatt cin est un objet de type istream qui encapsule l'accès à l'entrée standard de votre programme. Vous pouvez le remplacer par n'importe quel objet de type istream (ou d'un type dérivé) tel qu'un flux de fichier. –

2

La plupart (peut-être) tous les systèmes d'exploitation mémoire tampon d'entrée. Lorsque vous tapez une chaîne de mots, puis appuyez sur [Entrée], c'est seulement au moment où vous appuyez sur Entrée que l'entrée est généralement transmise à votre programme. C'est ainsi qu'il commencera à lire l'entrée et à la séparer en mots individuels (car comme le mentionne Neil, le >> lit des mots, pas des lignes). Ainsi, votre programme passe plusieurs fois par la boucle (une fois par mot que vous aviez dans la ligne), même si vous ne tapez qu'une seule fois. Donc, vous avez raison quand vous pensez qu'il ne devrait afficher "could you ..." qu'une seule fois par boucle. C'est ce qui se passe.

De même, vous n'aurez jamais une commande contenant plus d'un mot à cause du délimiteur d'espace. Comme mentionné, utilisez getline() pour récupérer le texte entier pour la ligne que vous avez entrée.

Questions connexes