2016-04-20 9 views
1

Ich arbeite an einem Projekt, bei dem der Benutzer aufgefordert wird, eine Postleitzahl einzugeben. Ich muss überprüfen, dass es eine fünfstellige Nummer ist (ich muss nicht überprüfen, dass es eine tatsächliche Postleitzahl ist).Überprüfen Sie, dass die Benutzereingabe eine 5-stellige Nummer ist

Hier ist ein Teil meines Codes.

string userInput; 
cout << "Zip Code> "; 
getline(cin, userInput, '\n'); 


while (stoi(userInput)<10000 || stoi(userInput) > 99999){ 
    cout << endl << endl << "You must enter a valid zip code. Please try again." << endl; 
    cout << "Zip Code>" << endl; 
    getline(cin, userInput, '\n'); 
} 

PropertyRec.setZipCode(stoi(userInput)); 

Dies funktioniert gut, es sei denn, die Postleitzahl beginnt mit einer Null. Wenn dies der Fall ist, ist die Validierung nicht gut und der ursprüngliche Nullwert wird nie in der Variablen gespeichert, sobald die Eingabezeichenfolge in eine Ganzzahl konvertiert wurde.

Sollte ich die Postleitzahl beim Speichern in der Datenbank als String belassen? Wenn ja, wie kann ich überprüfen, dass es genau 5 Zeichen gibt und jedes Zeichen numerisch ist?

+1

nehmen Sie es als eine Zeichenfolge und überprüfen Sie ihre Größe()? –

+0

Überprüfen Sie, ob die Eingabe fünf Zeichen enthält und jedes Zeichen eine Ziffer ist. –

+0

Verwenden Sie nicht 'std :: endl', es sei denn, Sie benötigen das zusätzliche Zeug, das es tut. '\ n'' beendet eine Zeile. –

Antwort

8

Verwenden std::all_of, isdigit und string::size() zu bestimmen, ob die Postleitzahl ist gültig:

#include <string> 
#include <algorithm> 
#include <cctype> 
//... 
bool isValidZipCode(const std::string& s) 
{ 
    return s.size() == 5 && std::all_of(s.begin(), s.end(), ::isdigit); 
} 

Live Example

Declarative Programming Stecker:

Beachten Sie, dass, wenn Sie laut sagen, die Linie in der isValidZipCode Funktion, es passt Ihre Beschreibung (die Zeichenfolge muss eine Größe von 5 und "alle" der Charakt haben er muss eine Ziffer sein).

+0

Danke Jungs! Funktioniert super. – Brent

4

Da Sie Eingabe als std::string empfangen, können Sie std::string::length (oder std::string::size) verwenden, um Ihnen die richtige Menge an Zeichen sicherzustellen haben:

if (userInput.length() != 5) 
{ 
    // Input is invalid 
} 

Um sicherzustellen, dass sie nur Zahlen sind, wie @ user4581301 Punkte out Sie Es ist std::all_of und isdigit (Check-out oder Antworten in this question)

if (userInput.length() == 5 && std::all_of(s.begin(), s.end(), ::isdigit)) 
{ 
    // Input is valid 
} 

auch erwähnenswert, dass die folgende Zeile verwenden können

PropertyRec.setZipCode(stoi(userInput)); 

entfernt alle führenden 0 Sie haben, so können Sie Ihre Postleitzahl als std::string speichern müssen (es sei denn, Sie Behandlung implementieren, die jede Postleitzahl davon ausgehen, dass < 5 ist 0'en hat führende, aber es ist wahrscheinlich viel einfacher um es genau so zu speichern, wie es ist)

0

Sie können die Stringgrößenfunktion verwenden, um die Größe der Zeichenfolge zu ermitteln. Speichern Sie die Zeichenfolgengröße in anderen Variablen und überprüfen Sie, ob sie kleiner als fünf sind oder nicht.

Verwandte Themen