2016-04-25 14 views
-2

Wenn ich versuche, von dem Benutzer einen Benutzernamen zu bekommen, ich folgendes machen:Cin arbeitet nicht mit Array von Zeichen

#include <iostream> 

using namespace std; 
void main(){ 
char *usrn=new char[20]; //Max username length of 20 alfanumeric characters 
    std::string usrn_str; 
     while (true){ 
      std::cout << "Enter the username(3-20 characters): "; 
      cin.clear(); 
      cin.ignore(); 
      std::cin.getline(usrn,22); 
      usrn_str=usrn; 
      if ((usrn_str.length())<3){ 
       cout << "Introduced username too short!" << endl; 
      } 
      else if ((usrn_str.length())>=21){ 
       cout << "Introduced username too long!" << endl; 
      } 
      else { 
       cout << usrn_str.c_str() ; 
      } 
     } 
} 

Wie auch immer, wenn eine größere Benutzernamen als die erlaubte ein, dh 25 einzuführen, zeigt es mir die Nachricht, dass der eingeblendete Benutzername zu lang ist, aber in der nächsten Schleife kann ich den Benutzernamen nicht mehr eingeben, weil es dauert, da ich die letzten 5 Zeichen im genannten Beispiel eingegeben habe. Zusammenfassend, wenn ich einen Benutzernamen mit einer Länge von 30 eintrage, verwirft er die ersten 20 und setzt die letzten 10 als Benutzernamen, wenn ich den Benutzernamen fragen möchte, bis ich einen Benutzernamen mit einer Länge von 3-20 bekomme.

Wie könnte ich es implementieren? Jede Hilfe wird geschätzt.

+0

Versuchen 'std :: cin.ignore (256, '\ n')' – ArchbishopOfBanterbury

+3

Verwenden Sie einen [ 'std :: string'] (http://en.cppreference.com/w/cpp/string/basic_string), lese den gesamten Benutzernamen ein und überprüfe dann die Größe. Wenn es zu groß ist, wiederhole es. – NathanOliver

+0

Warum verwenden Sie diesen Zeiger überhaupt zum char? Benutze 'std :: string' und alles wird gut. – ForceBru

Antwort

1

Verwenden Sie std::getline(), um die gesamte Benutzereingabe zu lesen (die Benutzereingabe erfolgt zeilenbasiert). Führen Sie dann die Validierungsprüfungen mit der Eingabezeile durch.

bool  finished = false; 
std::string name; 
do 
{ 
    if (std::getline(std::cin, name)) 
    { 
      // You have successfully read one line of user input. 
      // User input is line based so this is usually the answer to 
      // one question. 
      // 
      // Do your validation checks here. 
      // If the user entered data that checks out then set 
      // finished to true. 
    } 
    else 
    { 
      // There was a problem reading the line. 
      // You need to reset the stream to a good state 
      // before proceeding or exit the application. 
    } 
} 
while(!finished);