2017-09-08 13 views
1

Salut les gars, je pose la question suivante:Quand l'entrée va s'arrêter?

string s;

std::cout << "give me a string" << std::endl; 
while (std::cin >> s){ 
    std::cout << "give me a string" << std::endl; 
} 
cin.clear(); 

si s est un entier alors je sais que si je tapais un omble alors le tout briserait. Si c'était un entier et tapé un double la même chose serait arrivé. Mais qu'en est-il chaînes ?? Quelque part, j'ai lu cela dans les fenêtres (comme j'écris à netbeans dans Windows), vous devez appuyer sur Ctrl + Z et puis il s'arrête comme il est pris comme une fausse chaîne. Mais quand je fais cela, le processus se fige et rien ne se passe.

+0

Vous ne devriez pas doubler entrer arrêter ceci? –

+0

ça ne va pas arrêter ça. Si je tape 'ctrl + d', ça s'arrête réellement !! merci pour réponse btw! –

Répondre

2

Vous devez envoyer le signal EOF, qui dans Netbeans est Ctrl + D. Cependant, si vous appuyez deux fois sur Entrée, l'état de votre boucle sera résolu en faux, ce qui entraînera l'arrêt de la boucle. C'est excpected: How is "std::cin>>value" evaluated in a while loop?

Si cela ne fonctionne pas, utilisez Ctrl + z et un caractère de nouvelle ligne, qui est le signal EOF dans Windows, comme indiqué here. Ctrl + D est pour Linux, mais cela fonctionne dans votre cas.

Le signal EOF ferme le flux d'entrée, rompant ainsi la boucle.


De plus, dans Netbeans (si le précède ne fonctionne pas), il semble que vous devez run your application from the command prompt pour y parvenir. Une autre tentative serait de "appuyer sur Ctrl + z après avoir appuyé sur Entrée", comme indiqué here.

+1

Pas sur Linux. Si vous appuyez sur Ctrl + D, le flux et le programme sont finis. – jdehesa

+0

J'ai essayé double entrée sur VS 2012 et cela ne fonctionne pas (testé dans la console par défaut). Précisément, appuyer sur Entrée n'entre pas dans une parenthèse de boucle. – R2RT

+0

merci pour la réponse, en fait il ne s'arrêtera pas, car il change 2 lignes et après cela il attend une entrée. Si je tape quelque chose, il l'acceptera. @jdehesa a tellement raison, ça a vraiment marché !! thx –

1

La boucle s'arrête lorsque le flux d'entrée est fermé.

Si vous exécutez le programme à partir d'un shell, le flux d'entrée peut être ouvert indéfiniment. La façon exacte dont vous fermez le flux dans un terminal dépend du terminal que vous utilisez.

Sous UNIX, le flux est fermé lorsque vous envoyez une entrée vide. ctrl + d est la combinaison de touches standard pour l'envoi (vidage) de l'entrée au flux (^d est le code de contrôle ASCII EOT, fin de la transmission). En appuyant sur Entrée, vous envoyez également l'entrée, mais elle insère également le caractère de fin de ligne, il n'est donc pas possible de l'utiliser pour envoyer une entrée vide.

ctrl + z est similaire dans les fenêtres, mais il a different behaviour (wikipedia):

Le caractère EOT sous Unix est différent du contrôle-Z sous DOS. L'octet DOS Control-Z est réellement envoyé et/ou placé dans des fichiers pour indiquer où le texte se termine. En revanche, le Control-D amène le pilote de terminal Unix à signaler la condition EOF, qui n'est pas un caractère, tandis que l'octet n'a pas de signification particulière s'il est réellement lu ou écrit à partir d'un fichier ou d'un terminal.

+0

Comme je l'ai déjà dit dans un commentaire 'ctrl + z' il n'arrête pas le processus, donc' ctrl + d' fera le travail. Merci pour la réponse! –