2010-12-03 5 views
1

Je commence juste à apprendre le C++. Quand j'exécute mon code, il saute du programme sans erreur. Pourquoi?pourquoi son saut hors du programme?

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    char s1[20],s2[10]; 
    cout<<" enter a number : "; 
    cin.get(s1,19); 
    cout<<" enter a number : "; 
    cin.get(s2,9); 

    cout<<s1<<"/n"<<s2; 

    getch(); 

} 
+0

Qu'est-ce que vous voulez dire "ça saute du programme"? Vous voulez dire que vous n'avez pas à entrer des choses opn s1 et s2 ?? – Muggen

+2

Pourquoi utiliseriez-vous la priorité de Microsoft, les extensions malveillantes de C++ comme '' stdafx.h '', et' _tmain' en premier lieu? –

+1

Mec. Vous êtes sûr que ça compile? Ce n'est pas pour moi sur VS2008. Qu'incluez-vous pour getch()? – Muggen

Répondre

6

Le get() méthode lit jusqu'à le caractère '\ n' mais n'extrait pas.

Donc, si vous tapez: 122345<enter>
Cette ligne:

cin.get(s1,19); 

lirons 12345, mais le '\ n' (créé en appuyant sur <entrer>) est à gauche sur le flux d'entrée. Ainsi, la ligne suivante à lire:

cin.get(s2,9); 

Ne lira rien comme il voit le «\ n» et s'arrête. Mais il n'extrait pas le '\ n' non plus. Donc, le flux d'entrée a toujours le '\ n' là. Donc, cette ligne:

getch(); 

Lit simplement le caractère '\ n' dans le flux d'entrée. Ce qui lui permet ensuite de terminer le traitement et de quitter le programme normalement.

OK. C'est ce qui se passe. Mais il y a plus à cela. Vous ne devriez pas utiliser get() pour lire une entrée formatée. Utilisez l'opérateur >> pour lire les données formatées dans le bon type.

int main() 
{ 
    int x; 
    std::cin >> x; // Reads a number into x 
        // error if the input stream does not contain a number. 
} 

Parce que le std :: cin est un flux en mémoire tampon les données ne sont pas envoyées au programme jusqu'à ce que vous appuyez sur <entrer> et le flux est rincée. Ainsi, il est souvent utile de lire le texte (à partir de l'entrée de l'utilisateur) une ligne à la fois, puis analyser cette ligne de façon indépendante. Cela vous permet de vérifier la dernière entrée de l'utilisateur pour les erreurs (sur une base ligne par ligne et de la rejeter s'il y a des erreurs).

int main() 
{ 
    bool inputGood = false; 
    do 
    { 
     std::string line; 
     std::getline(std::cin, line); // Read a user line (throws away the '\n') 

     std::stringstream data(line); 
     int x; 
     data >> x;     // Reads an integer from your line. 
            // If the input is not a number then data is set 
            // into error mode (note the std::cin as in example 
            // one above). 
     inputGood = data.good(); 
    } 
    while(!inputGood); // Force user to do input again if there was an error. 

} 

Si vous voulez vous perfectionner, vous pouvez également consulter les bibliothèques boost. Ils fournissent du code sympa en général et en tant que programme C++, vous devriez connaître le contenu de boost. Mais nous pouvons réécrire ce qui précède que:

int main() 
{ 
    bool inputGood = false; 
    do 
    { 
     try 
     { 
      std::string line; 
      std::getline(std::cin, line); // Read a user line (throws away the '\n') 

      int x = boost::lexical_cast<int>(line); 
      inputGood = true;    // If we get here then lexical_cast worked. 
     } 
     catch(...) { /* Throw away the lexical_cast exception. Thus forcing a loop */ } 
    } 
    while(!inputGood); // Force user to do input again if there was an error. 

} 
+0

+1 'entrez' neato –

1

Vous devez utiliser cin.ignore(); ignorer le caractère saut de ligne de flux avant d'obtenir l'entrée suivante.

+2

"Vider le flux" est incorrect. – meagar

+0

@maxim, @ Dave18: Ne fais pas ça. Vous êtes en train de rendre l'analyse d'un nombre très difficile (surtout si l'utilisateur ne tape pas un nombre).Vous devriez utiliser l'opérateur >> pour lire un nombre –

Questions connexes