2014-02-16 13 views
5

Ich schrieb den folgenden Code, um zu überprüfen, ob die Eingabe (Antwort3) eine Zahl oder eine Zeichenfolge ist, wenn es keine Zahl ist, sollte es nur "Zahlen eingeben" zurückgeben das Gleiche auch für Zahlen. Bitte schlage mir eine Lösung vor.Überprüfen Sie, ob die Eingabe eine Zahl oder Zeichenfolge in C++ ist

#include <iostream> 
#include <string> 
#include <typeinfo> 
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

using namespace std; 
int main() 
{ 

string ques1= "Client's Name :"; 
string ques2 = "Client's Address :"; 
string ques3 = "Mobile Number :"; 

char answer1 [80]; 
string answer2; 
int answer3; 

    cout<<ques1<<endl;  
    cin>>answer1;  

    cout<<ques2<<endl;  
    cin>>answer2; 

    cout<<ques3<<endl; 
    cin>>answer3; 

     if (isdigit(answer3)) 
     { 
       cout<<"Correct"<<endl;  

       } 

     else 
     { 
      cout<<"Enter Numbers Only"<<endl; 

      } 

system("pause>null"); 
return 0; 

} 
+5

Stimmt etwas mit der Eingabetaste auf Ihrer Tastatur nicht? Die Leertaste scheint ebenfalls zweideutig zu sein. –

+1

'isdigit' nimmt ein einzelnes Zeichen als' int', interpretiert es als ASCII-Zeichen und gibt einen Wert ungleich Null zurück, wenn es ein Ziffernzeichen ('0' bis '9', ASCII 48 bis 57) oder ist Null, wenn es nicht ist. Es kann Ihnen nicht sagen, ob Sie eine Ganzzahl in 'answer3' gelesen haben. –

+1

Ferner, 'cin >> someIntVariable' verwirft führende Leerzeichen, liest ein optionales Zeichen (' -' oder '+'), gefolgt von einer Folge von Ziffern, und stoppt am ersten Zeichen ohne Ziffer. Wenn also jemand etwas eingibt, das nicht interpretiert werden kann, wird die Variable auf 0 gesetzt. Deshalb scheitert "isdigit" später. –

Antwort

6

Wenn Sie mit C++ 98, können Sie stringstreams (#include <sstream>) verwenden:

std::string s = "1234798797"; 
std::istringstream iss(s); 

int num = 0; 

if (!(iss >> num).fail()) { 
    std::cout << num << std::endl; 
} 
else { 
    std::cerr << "There was a problem converting the string to an integer!" << std::endl; 
} 

Wenn Schub für Sie verfügbar ist Sie lexical_cast verwenden können (#include <boost/lexical_cast.hpp>) :

std::string s = "1234798797"; 
int num = boost::lexical_cast<int>(si);//num is 1234798797 
std::cout << num << std::endl; 

Wenn C++ 11 bis Sie verfügbar ist, können Sie die eingebaute std::stoifunction von <string> verwenden:

std::string s = "1234798797"; 
int mynum = std::stoi(s); 
std::cout << mynum << std::endl; 

AUSGÄNGE:

1234798797 
2

Die Funktion isdigit() verwendet wird, zu testen, nur Ziffern (0,1, ..., 9)

Verwenden Sie diese Funktion, um nach Nummern zu suchen

+0

Und was passiert, wenn die Zeichenfolge einen Dezimalpunkt enthält? – jrd1

+1

Dies kann nicht für Dezimalzahlen verwendet werden. Nur ganze Zahlen können überprüft werden. –

+0

Das ist genau mein Punkt. – jrd1

1

Der Eingang isdigit ist ein ganzzahliger Wert. Es wird jedoch nur dann wahr (ungleich Null) zurückgegeben, wenn der Wert "0" - "9" entspricht. Wenn Sie sie in ganzzahlige Werte konvertieren, sind sie 48-57. Für alle anderen Werte gibt isdigit false (null) zurück.

können Sie überprüfen, ob Sie eine ganze Zahl bekam durch Prüflogikschaltung Wechsel:

if (cin.fail()) 
{ 
    cout<<"Correct"<<endl;  
} 
else 
{ 
    cout<<"Enter Numbers Only"<<endl; 
} 
0

Das Interesse Phänomen sind die isdigitchar erfordert unsigned char gegossen werden. (Siehe auch here).

5

Sie können regex, dies zu tun:

#include <regex> 

bool isNumber(std::string x){ 
    std::regex e ("^-?\\d+"); 
    if (std::regex_match (x,e)) return true; 
    else return false;} 

Wenn Sie isNumber() eine generische Funktion machen wollen, die jede Art von Eingabe nehmen:

#include <regex> 
#include <sstream> 

template<typename T> 
bool isNumber(T x){ 
    std::string s; 
    std::regex e ("^-?\\d+"); 
    std::stringstream ss; 
    ss << x; 
    ss >>s; 
    if (std::regex_match (s,e)) return true; 
    else return false;} 

Die oben isNumber() Funktion prüft für integer Nur der Wert double oder float mit der Genauigkeit (der den Punkt . enthält) gibt nicht true zurück. Wenn Sie Präzision zu wollen, dann die regex Linie ändern:

std::regex e ("^-?\\d*\\.?\\d+"); 

Wenn Sie eine effizientere Lösung wollen, this one sehen.

1

Eine andere Antwort mit strtod:

#include <sstream> 

template<typename T> 
bool isNumber(T x){ 
    std::string s; 
    std::stringstream ss; 
    ss << x; 
    ss >>s; 
    if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ; 
    char * p ; 
    strtod(s.c_str(), &p) ; 
    return (*p == 0) ; 
} 

Hinweis:

  1. Weiß Raum

    bool isNumber(const std::string& s){ 
        if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ; 
        char * p ; 
        strtod(s.c_str(), &p) ; 
        return (*p == 0) ; 
    } 
    

    jede Art von Parameter Verwendung Vorlage zu handhaben können wird es falsch zurückgeben.

  2. NAN und INF wird es false zurückgeben (um genau zu sein, jedes Zeichen außer gültigen Exponenten wird es false zurückgeben). Wenn Sie nan und inf zulassen möchten, löschen Sie den Teil || std::isalpha(s[0]).
  3. wissenschaftliche Form ist zulässig, d. H. 1e + 12 wird wahr zurückgeben.
  4. Double/Float oder Integer gibt True zurück.
  5. Dies ist effizienter als die regex answer. (Regex ist schwer).
0

Dies ist eine etwas alte Frage, aber ich dachte, ich würde meine eigene Lösung hinzufügen, die ich in meinem Code verwende.

Eine weitere Möglichkeit, zu überprüfen, ob eine Zeichenfolge eine Zahl ist, ist die std::stod Funktion, die erwähnt wurde, aber ich benutze es ein bisschen anders. In meinem Anwendungsfall, verwende ich einen Try-Catch-Block zu überprüfen, ob die Eingabe eine Zeichenfolge oder eine Zahl ist, wie so mit Ihrem Code:

... 
try { 
    double n = stod(answer3); 
    //This will only be reached if the number was converted properly. 
    cout << "Correct" << endl; 
} catch (invalid_argument &ex) { 
    cout << "Enter Numbers Only" << endl; 
} 
... 

Das primäre Problem bei dieser Lösung ist, dass Zeichenkette, die mit Zahlen beginnen (aber sind nicht alle Nummern) wird in Zahlen umgewandelt werden. Dies kann leicht behoben werden, indem std::to_string für die zurückgegebene Nummer verwendet und mit der ursprünglichen Zeichenfolge verglichen wird.

Verwandte Themen