2010-11-24 5 views
0

Ich schreibe ein Programm, das als Taschenrechner fungiert; basierend auf der Zeicheneingabe durch den Benutzer führt er eine bestimmte Operation durch. Die Struktur des Programms scheint gut zu funktionieren, aber ich würde gerne in der Lage sein, nach fehlerhaften Eingaben zu suchen. Kann man nach dem Erhalt der float-Variablen prüfen, ob sie keine anderen Zeichen als Ziffern und Dezimalzahlen enthält? Ich habe isdigit versucht, und dies:C++ Wie man eine Eingabe-Float-Variable für eine gültige Eingabe überprüft

if (!(cin >> x)) { 
    cout << "You did not enter a correct number!" << endl; 
    return; 
} 

Aber nichts scheint zu funktionieren. Hier

ist ein Beispiel für eine der einfachen Bedienung Funktionen Ich verwende:

void Add(){ 
    float x = 0, y = 0, z = 0; 
    cout << "Please enter two numbers you wish " 
     << "to add separated by a white space:" << endl; 
    cin >> x >> y; 
    z = x+y; 
    cout << x << " + " << y << " = " << z << "." << endl; 
    return; 
} 
+0

möglich Duplikat [C++ IsFloat Funktion] (http://stackoverflow.com/questions/447206/c-isfloat-function) – Jack

+0

überprüfen Sie den Link zu der duplizieren, vielleicht kann es dir helfen – Jack

+0

Könntest du ein kleines Beispiel für die Eingabe bereitstellen, die nicht für dich funktioniert und was du willst? –

Antwort

1

Um fehlerhafte Eingabe zu erkennen, wo Sie eine Zahl erwartet haben, weiß C++ nicht automatisch, was Sie wollen. Eine Lösung besteht darin, zuerst Ihre Eingabe als Zeichenfolgen zu akzeptieren, diese Zeichenfolgen zu validieren und dann die Zeichenfolgen zu konvertieren um Zahlen mit der Funktion atof() zu floaten.

Die Standard-String-Klasse hat eine Funktion namens find_first_not_of(), mit der Sie C++ mitteilen können, welche Zeichen Sie für gültig halten. Wenn die Funktion ein Zeichen findet, das nicht in Ihrer Liste ist, wird die Position des schlechten Zeichens zurückgegeben, andernfalls wird string :: npos zurückgegeben.

// add.cpp 

#include <iostream> 
#include <string> 
#include <cstdlib> // for atof() 

using namespace std; 


void Add() 
{ 
    cout << "Please enter two numbers you wish " 
     << "to add, separated by a white space:" 
     << endl; 

    string num1, num2; 

    cin >> num1; 
    if(num1.find_first_not_of("1234567890.-") != string::npos) 
    { 
     cout << "invalid number: " << num1 << endl; 
     return; 
    } 

    cin >> num2; 
    if(num2.find_first_not_of("1234567890.-") != string::npos) 
    { 
     cout << "invalid number: " << num2 << endl; 
     return; 
    } 

    float x = 0, y = 0, z = 0; 
    x = atof(num1.c_str()); 
    y = atof(num2.c_str()); 
    z = x+y; 

    cout << x << " + " << y << " = " << z << "." << endl; 
} 

int main(void) 
{ 
    Add(); 
    return 0; 
} 
+0

Danke Shawn! Diese Lösung funktioniert perfekt für mich. Ich habe es nur als Funktion programmiert und kann jetzt die Eingabe für alle meine Operationsfunktionen verwenden. Vielen Dank für Ihre Hilfe. Ich werde wahrscheinlich eine Menge Fragen in der Zukunft haben und diese Seite wird eine große Hilfe sein! Prost. – ghudner

2

Sie testen den Zustand des Stroms:

float x, y; 
if (std::cin >> x >> y) { 
    // input extraction succeeded 
} 
else { 
    // input extraction failed 
} 

Wenn dies nicht für Sie arbeiten , dann müssen Sie den genauen Code posten, der nicht funktioniert.

0

Eine Möglichkeit wäre, die Eingabe als String zu lesen und dann boost lexical_cast zu verwenden, um in Fließkommazahl zu konvertieren. lexical_cast betrachtet die Konvertierung nur dann als erfolgreich, wenn der gesamte Eingang in das Ziel konvertiert wird - andernfalls wird eine bad_lexical_cast Ausnahme ausgelöst.

0

Eine andere Idee wäre, die Eingabe gegen eine Regex zu testen. Ein Beispiel regex für einen Schwimmer könnte

-?[0-9]+([.][0-9]+)? 

Diese Methode wird auch nur die passende Mechanismus zu verfeinern machen wäre es einfacher, durch die Regex ändern, und Sie mehrere reguläre Ausdrücke gegen verschiedene Typen von Eingabe, zum Beispiel eine ganze Zahl Karte könnte könnte dann als

-?[0-9]+ 

und so weiter ausgedrückt werden. Beachten Sie jedoch, dass dies nur dann überprüft wird, wenn die Eingabe ein gültiges Format ist, und dass danach noch eine numerische Konvertierung erforderlich ist (ich bevorzuge boost :: lexical_cast).

(Sie können es auch mit http://gskinner.com/RegExr/ ausprobieren)

Verwandte Themen