# String auf Zahlen überprüfen



## Folcan (11. September 2007)

Hi,

ich hab das Problem, das ich beim einlesen des Strings diesen nicht auf Zahlen überprüfen kann. Bzw. die Schleife funktioniert einmal, beim zweiten durchlauf funktioniert sie aber nicht mehr. Egal was ich beim zweitenmal eingebe es kommt immer die Ausgabe:

cout <<"Bei Kommazahlen bitte Punkt als Kommaverwenden!\n\n\n";
cout <<"Bitte geben Sie die maximalen Punkte ein:" << endl;

Wo liegt denn da der fehler, oder geht das ganze auch einfacher?
Die Aufgabe sollte sein, das man nur Zahlen eingeben kann (auch Kommazahlen)
Schonmal Danke im voraus.


float TestInput()
{
       char a,b;
       float maxPointsOk;
       string temp;
       bool exitInput = false;

       for(;
       {
               temp.erase();    //string "leeren"
               b = '';         // char werte setzten!
               a = '';         // char werte setzten!

               cout <<"Bei Kommazahlen bitte Punkt als Kommaverwenden!\n\n\n";
               cout <<"Bitte geben Sie die maximalen Punkte ein:" << endl;

               b=cin.get();
               while(a!='\n')
               {
                       a=cin.get();
                       temp+=a;


                               if((a=='0')||(a=='1')||(a=='2')||(a=='3')||(a=='4')||(a=='5')||(a=='6')||(a=='7')||(a=='8')||(a=='9')
			       {

                                      exitInput = true;
                                      break;
			       }

                               else
			       {	

                                       system("cls");
                                       cout << "Ihre Eingabe war leider Falsch!\n";
                                       cout << "\nBitte wiederholen Sie Ihre eingabe!\n\n\n";
			       }
                               break;
                       }

               }

               temp = b+temp;

               if(exitInput == true)
               {
                       break;
               }

       }
       stringstream Str;
       Str << temp;
       Str >> maxPointsOk;

       return maxPointsOk;
}


----------



## swalbking (11. September 2007)

Hallo,
benutze doch bitte beim nächsten Mal die [Code] -Tags.

```
float TestInput()
{
       char a,b;
       float maxPointsOk;
       string temp;
       bool exitInput = false;

       for(;;)
       {
               temp.erase();    //string "leeren"
               b = '';         // char werte setzten!
               a = '';         // char werte setzten!

               cout <<"Bei Kommazahlen bitte Punkt als Kommaverwenden!\n\n\n";
               cout <<"Bitte geben Sie die maximalen Punkte ein:" << endl;

               b=cin.get();
               while(a!='\n')
               {
                       a=cin.get();
                       temp+=a;

                       
                               if((a=='0')||(a=='1')||(a=='2')||(a=='3')||(a=='4')||(a=='5')||(a=='6')||(a=='7')||(a=='8')||(a=='9')
			       {

                                      exitInput = true;
                                      break;
			       }

                               else
			       {	

                                       system("cls");
                                       cout << "Ihre Eingabe war leider Falsch!\n";
                                       cout << "\nBitte wiederholen Sie Ihre eingabe!\n\n\n";
			       }
                               break;
                       }

               }

               temp = b+temp;

               if(exitInput == true)
               {
                       break;
               }

       }
       stringstream Str;
       Str << temp;
       Str >> maxPointsOk;

       return maxPointsOk;
}
```
Außerdem fällt mir so auf Anhieb auf:
- einem char kann nicht nichts zugewiesen werden: char a=''; dürfte nicht funktionieren
- eine fehlende runde Klammer am Ende des if ((a=='0')||...-Blocks
- eine schließende geschweifte Klammer ist zu viel

Gruß,
swalbking


----------



## Eichel65 (11. September 2007)

Du könntest die eine eigene Funktion schreiben die überprüft ob Char-Var >= ASCII-Anfang-für-Zahl && Char-Var <= ASCII-Ende-für-Zahl...

Ich weiß nur leider nicht den Anfang und das Ende der Zahlen in der ASCII-Tabelle, aber so würd ich das am schnellsten lösen.

Gruß

//EDIT, braucht man ja gar nicht fällt mir gerade ein!! Ich hab diese Lösung zwar noch nicht ausprobiert, sollte aber funktionieren!

```
if( ( CHAR-VAR >= '0' ) && ( CHAR-VAR <= '9' ) )
{
}
```

VORSICHT, das funktioniert natürlich nur bei einer Char-Variable mit einem Zeichen!!

GRuß


----------



## Teambeta (11. September 2007)

Eichel65 hat gesagt.:


> Du könntest die eine eigene Funktion schreiben die überprüft ob Char-Var >= ASCII-Anfang-für-Zahl && Char-Var <= ASCII-Ende-für-Zahl...
> 
> Ich weiß nur leider nicht den Anfang und das Ende der Zahlen in der ASCII-Tabelle, aber so würd ich das am schnellsten lösen.
> 
> ...



Naja einen String direkt zu überprüfen geht wohl schlecht ;-).

Schau dir mal die Funktion *isdigit*, die in *ctype.h* deklariert wurde, an.


----------



## Folcan (12. September 2007)

ok super ich glaub damit kann ich was machen, habs mir grade mal angesehen.

Gruß Folcan


----------



## Winner (12. September 2007)

Ich hatte auch das Problem das ich den String nicht prüfen konnte ob es eine Zahl oder Buchstabe ist!

da gibt es die sehr elegante möglichlichkeit mit einer Methode zu prüfen:

Hier mal eine kleine Funktion die ich selber geschrieben habe, indem das mit dem isdigit vorkommt!


```
void KoordFilter(char *koordX, char *erg){
	char *ptrX=koordX;
	char *ptrXneu= erg;

	while(*ptrX){
			
		if( isdigit(*ptrX) || *ptrX == '.' ){ 
			//printf("\nIsdigit");
			//printf("%c", *ptrX);
			*ptrXneu++ = *ptrX;
			}
		*ptrX++;
		}
		*ptrXneu= '\0';

		//printf("\nAusgabe durch Funktion: %s" , erg);
}
```


Ich hoffe du kommst mit dem Beispiel zu recht!

Gruß + Viel Erfolg


----------



## RedWing (12. September 2007)

Teambeta hat gesagt.:


> Naja einen String direkt zu überprüfen geht wohl schlecht ;-).



Er will ja keinen String sondern einen Character überprüfen. Und das geht schon... Nur mal so nebenbei 

Gruß,
RedWing


----------



## Teambeta (12. September 2007)

RedWing hat gesagt.:


> Er will ja keinen String sondern einen Character überprüfen. Und das geht schon... Nur mal so nebenbei
> 
> Gruß,
> RedWing



Das habe ich auch nie behauptet, so nebenbei.


----------



## RedWing (12. September 2007)

Entschuldige,
dann hab ich wohl die versteckte Botschaft deiner Aussage nicht verstanden

Gruß,
RedWing


----------

