Daten|teiler
Kopieren als Kulturtechnik

Die Funktion istZahl in C++

16. Februar 2009 von Christian Imhorst

Für ein kleines Programmierprojekt muss ich in C++ eine Eingabe überprüfen, ob wirklich nur ganze Zahlen, oder etwa andere Zeichen eingegeben wurden. Ich dachte da an dieses kleine Stück Quellcode:

#include <iostream>
using namespace std;
 
int main(){
 
        int zahl = 0;
        char zeichen[20];
        cout<<"Bitte Zahl eingeben: ";
        cin>>zeichen;
 
        while (!(sscanf(zeichen, "%d", &zahl))) {
        	cout<<"\nUngültige Eingabe. \nBitte nur Zahlen eingeben: ";
        	cin>>zeichen;
		}
            cout<<zahl<< " ist eine Zahl"<<endl;
 
}

Nur leider zeigt dieser Code-Schnipsel bei größeren ganzen Zahlen nur noch die Zahl 2147483647 an, was genau dem obersten Wertebereich des Datentyps int entspricht. Eine Zahl die größer ist, kann das Programm nicht anzeigen:

<em>Diese Zahl kommt einem bekannt vor...</em>

Diese Zahl kommt einem bekannt vor...

Da ich aber mit Eingaben rechnen muss, die mehr als zehn Stellen haben können, hilft mir dieses Code-Beispiel nicht weiter. Daher habe ich eine eigene Funktion istZahl() geschrieben:

#include <iostream>
#include <cstring>
using namespace std;
 
int istZahl(char zahl[10]){
	int laenge=strlen(zahl);
	for(int i=0; i<laenge; i++)
        if ( !((int)zahl[i] > 47 && zahl[i] < 58)){
		return false;
		}
	return true;
	}
 
int main(){
	char a[20];
	cout<<"Bitte eine Zahl eingeben: ";
	cin.getline(a,20);
 
	while (istZahl(a)==false){
	cout<<"\nUngültige Eingabe. \nBitte nur Zahlen eingeben: ";
	cin.getline(a,20);
}
	cout<<a<<" ist eine Zahl."<<endl;
 
	return 0;
 
}

Hier kann eine ganze Zahl mit bis zu 19 Stellen eingegeben werden, da die 20. Stelle für die Endekennung \0 benötigt wird. Alle Stellen, die darüber hinausgehen, werden einfach abgeschnitten. Sollte das nicht reichen, kann man den Wert im Quellcode noch erhöhen.

So würde ich es machen, aber vielleicht gibt es ja noch schönere Lösungen?

[Update] Wie man an den Kommentaren vielleicht schon sieht, geht die Funktion noch schöner und hat Dank Stefan den neuen Namen istZiffer():

#include <iostream>
#include <cstring>
using namespace std;
const int MAX=5;
 
bool istZiffer(char ziffer[MAX]){
	int laenge=strlen(ziffer);
	for(int i=0; i<laenge; i++)
        if (!(ziffer[i] >= '0' && ziffer[i] <= '9')) 
        // if (! isdigit (ziffer[i]))
        {
		return false;
		}
	return true;
	}
 
int main(){
	char a[MAX];
 
	do 
	{
		cout<<"Bitte Ziffern eingeben: ";
		cin.getline(a,MAX);
 
    }while (istZiffer(a)==false);
 
	cout<<a<<" ist eine Zahl."<<endl;
 
	return 0;
 
}

Das funktioniert soweit ganz gut, bis auf ein oder zwei Schönheitsfehler:

  1. Wenn ich im obigen Beispiel istZiffer() mehr als 4 Ziffern eingebe, wird alles was danach kommt einfach abgeschnitten, was aber für meine Bedürfnisse nicht weiter schlimm ist.
  2. Gebe ich aber z.B. mehr als vier Buchstaben ein, habe ich einen nervigen Programmabbruch, den ich noch nicht ganz weg bekomme.
  3. Wie dee schon sagt: Die Enter-Taste wird von der Funktion wie eine Ziffer behandelt, was ich auch noch ändern muss.

Aber Dank der vielen guten Kommentare ist die Funktion schon viel besser geworden. ;-)

Geschrieben in Programmieren