2017-03-15 7 views
-1

Ich habe ein Programm wie dieses,Detecting ENTER-Taste in C++

char name[100]; 
char age[12]; 
cout << "Enter Name: "; 
cin >> name; 

cout << "Enter Age: "; 
cin >> age; 

Jetzt Alter ist ein optionales Feld, so Benutzer einfach die Taste ENTER drücken und diesen Wert als NULL haben. Aber das Problem ist, cin nimmt nicht die ENTER-Taste und bleibt einfach dort und wartet auf ein gültiges Tastatur-Zeichen oder eine numerische Eingabe.

Ich denke, das Problem ist, weil cin eine gültige Eingabe benötigt und somit für immer dort bleibt.

Also versuchte ich unten Ansatz zu erkennen ENTER-Taste für Alter drücken.

cout << "Enter Age: "; 
if (cin.get() == '\n') { 
      cout << "ENTER WAS PRESSED" << endl; 
     } 

Sobald der Benutzer die Eingabetaste drückt, nachdem er einen NAMEN eingegeben hat, geht es direkt in den IF-Zustand.

ich auch versucht:

getline(cin, age); 

Aber das auch nicht einfach für eine Eingabe von dem Benutzer bei cout << "Age: "; warten zu stoppen.

Der Benutzer kann entweder ein gültiges Alter eingeben oder einfach die EINGABETASTE drücken, um kein Alter einzugeben.

Für den folgenden Code:

cout << "Enter Name: "; 
     cin >> name; 

     cout << "Enter Age: "; 
     if (cin.get() == '\n') { 
      cout << "ENTER WAS PRESSED" << endl; 
     } 

Die Ausgabe lautet:

Enter Name: asdf 
Enter Age: ENTER WAS PRESSED 

ich die Cursor auf warten will Altes eingeben: _

Wie kann ich das tun?

+0

Zeigen Sie Ihren gesamten Code, wo das Problem 'wenn Sie Namen eingeben hinein geht nach wie vor, wenn' – Sniper

+0

mit Code aktualisiert und aktuelle Ausgabe. –

+0

Wenn Sie möchten, dass der Cursor auf 'Alter eingeben: _' wartet, wo möchten Sie dann die Ausgabe sehen? –

Antwort

0

Haben Sie versucht, diese ?:

cout << "Press Enter to Continue"; 
cin.ignore(); 

auch Besuche this question

+0

Ich denke, das Hinzufügen von cin.ignore() funktioniert für mich. –

0

Sie könnten in eine char-Variable cin und dann überprüfen, ob es die EINGABETASTE, und wenn nicht, weiterhin Zeichen abrufen und sie in ein int (mit Zeichen Subtraktion und all das). Es ist keine sehr schöne Lösung, aber es ist das erste, was mir in den Sinn kam.

0

Sie sind mehrere Probleme mit Ihrem Code:

  1. Sie anrufen operator>> mit char[] Puffer ohne Schutz vor Pufferüberläufe. Verwenden Sie std::setw(), um die Puffergrößen beim Lesen anzugeben. Verwenden Sie andernfalls std::string anstelle von char[].

  2. cin >> name liest nur die erste Leerzeichen getrennte Wort, um alle verbleibenden Daten im Eingangspuffer verlassen, einschließlich der Schlüssel ENTER, die dann nach oben gerichtet für neue Eingabe von cin >> age ohne zu warten. Um dies zu vermeiden, müssen Sie cin.ignore() aufrufen, um alle ungelesenen Daten zu verwerfen.Verwenden Sie andernfalls cin.getline() statt (oder std::getline() für std::string), was alles bis zu einem Zeilenumbruch verbraucht, aber den Zeilenumbruch nicht ausgibt (Sie sollten dies zumindest für den Wert name verwenden, damit Benutzer Namen eingeben können) Räume in ihnen).

  3. standardmäßig operator>> überspringen Leerzeichen führen, bevor Sie einen neuen Wert zu lesen, und das schließt Zeilenumbruch. Sie können drücken Sie ENTER alles, was Sie wollen, operator>> wird glücklich warten, bis etwas anderes eingegeben wird. Um das zu vermeiden, könnten Sie std::noskipws verwenden, was beim Lesen von Zeichendaten jedoch zu unerwünschten Nebeneffekten führt - führende Leerzeichen bleiben im Eingangspuffer, was dazu führt, dass operator>> nicht mehr liest, wenn ein Leerzeichen gelesen wird, bevor eine Benutzereingabe gelesen wird. Um dies zu vermeiden, können Sie cin.peek() verwenden, um nach einem eingegebenen Zeilenumbruch zu suchen, bevor Sie cin >> age aufrufen.

etwas mehr wie die Sie interessieren:

#include <iostream> 
#include <limits> 
#include <iomanip> 

char name[100] = {0}; 
char age[12] = {0}; 

std::cout << "Enter Name: "; 
std::cin >> std::setw(100) >> name; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* or: 
if (!std::cin.getline(name, 100)) 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
*/ 

std::cout << "Enter Age: "; 
if (std::cin.peek() != '\n') 
    std::cin >> std::setw(12) >> age; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

Oder:

#include <iostream> 
#include <string> 
#include <limits> 

std::string name; 
std::string age; 

std::cout << "Enter Name: "; 
std::cin >> name; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* or: 
std::getline(std::cin, name); 
*/ 

std::cout << "Enter Age: "; 
if (std::cin.peek() != '\n') 
    std::cin >> age; 
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
/* or: 
std::getline(std::cin, age); 
*/