0
votes

Détecter l'entrée vierge sur une variable de type entière?

Je travaille actuellement sur un jeu d'aventure textuel en tant que projet de classe. J'ai surtout tout commencé et travaille bien. Le seul problème est que lorsque je demande à l'utilisateur que la pièce qu'ils souhaitent passer, s'ils entrent une entrée vierge, un message doit alors produire dire "Vous devez choisir une pièce". Pour la vie de moi, je ne peux pas comprendre. Toute aide est très appréciée.

code: xxx


1 commentaires

N'appelez pas srand dans une boucle Srand () - Pourquoi l'appeler une seule fois?


3 Réponses :


0
votes

Le seul problème est que lorsque je demande à l'utilisateur que la pièce à laquelle ils veulent passer, s'ils entrent une entrée vierge, un message doit alors produire dire "Vous devez choisir une pièce" P>

Utiliser std :: getline code> puis extraire le numéro de la ligne à l'aide d'un std :: istringstream code> est une meilleure stratégie pour cela. P>

std::string line;
std::cout << "Choose an existing room. ";
while ( std::getline(std::cin, line) )
{
   // Try to get the room_change using istringstream.
   std::istringstream str(line);
   if ( str >> room_change )
   {
      // Successfully read the room.
      break;
   }

   // Problem reading room_change.
   // Try again.
   std::cout << "Choose an existing room. ";
}


0 commentaires

2
votes

Je viens de courir votre code et lorsque vous appuyez sur Entrée, il continuera à attendre jusqu'à ce que vous entriez un numéro ou quelque chose d'invalide tel qu'un caractère ou une chaîne. J'ai trouvé que si vous modifiez votre code de xxx pré>

à p> xxx pré>

lorsque l'utilisateur saisit une ébauche, cela provoquera la CIN. échouer () de retourner vrai, puis passez à l'impression "Choisissez une pièce existante." P>

Dans votre situation, la boucle tandis que la boucle restera appelée jusqu'à ce que nous ayons une entrée valide. Le "Choisir une pièce existante" est répété car Room_Change est un entier, donc lorsque nous appuyons sur Entrée, le "\ n" sera laissé dans le tampon. La boucle tandis que sur la prochaine itération se lit ensuite sur «\ N» et exécute le cin.fail () avant de vous laisser entrer autre chose. Une solution que j'ai trouvée est d'utiliser plus de déclarations cin.ignore (). P>

for (bool check = false; check == false;) { // Check if input is invalid
    cin >> noskipws >> room_change;
    if (cin.fail()) {
        cout << "Choose an existing room.";
        cin.clear();
        cin.ignore();
    } else if (room_change == room_current) {
        cout << "You're already in that room.";
        cin.ignore();
    } else {
        check = true;
        cin.ignore();
    }
}


3 commentaires

Bon sang, même je ne savais pas à ce sujet.


C'est une bonne idée, mais le problème que j'ai lorsque j'utilise, c'est que même avec des entrées numériques, il déclenche toujours le cin.fail ().


Dans votre scénario, car Room_Change est un entier, je suppose que le '\ n' restera dans le tampon, alors le cin.fail () est appelé à lire dans ce "\ n". La solution à cela sera d'ajouter plus de déclarations CIN.IGNORE (). Je vais éditer le code pour vous voir.



0
votes
#include <iostream>

using namespace std;

int main(){
    int room_change=200;

    cout<<"Enter Blank";
    cin>>room_change;

    if(room_change==NULL){
       cout<<"There is NO-THING"<<endl; 
    }

    if(room_change!=NULL){
       cout<<"There is something and that is :"<<room_change<<endl; 
    }


return 0;   
}
But a much simpler approach to this would be to use Strings. If this is a Homework of sort and you are limited to Integer variable only. Its much more complicated if you want to detect if an Buffer is empty or not. Regardless of homework limitation, the OS layer input is String based. How can I use cin.get() to detect an empty user input?

1 commentaires

Si vous pensez room_change == null évaluera à true si l'utilisateur entre une ligne d'entrée vide, vous vous trompez. Initialiser room_change à un numéro inhabituel, par exemple 200 et essayez-le.