# Überprüfen, ob Zahl oder anderes Zeichen eingegeben wurde...Wie?



## cler (10. November 2004)

Hallo zusammen,

in einem C-Programm soll durch den User eine Zahl eingegeben werden (0-10000). Ich möchte nun gerne überprüfen, ob der User eine Zahl eingegeben hat oder ein anderes Zeichen. Wenn es ein anderes Zeichen ist, will ich ihn dann darauf hinweisen. Leider weiß ich nicht, wie ich nachschauen kann, ob der User eine Zahl oder was anderes eingegeben hat. Gibt es da eine Funktion oder so was für oder wie könnte man das lösen?

Bin für jeden Tip dankbar..

Grüße

Cler (Sven)


----------



## Tobias K. (10. November 2004)

moin



So würde ich es machen:


```
char zahl[10];

	cin>> zahl;

	for( int i=0; i<5; i++)
             if ( ! ((int)zahl[i] > 47 && zahl[i] < 85))
	     	{
		     cout<<"Falsche Eingabe";
		     break;
		}
```

Es gibt zwar auch eine Funktion die ein einzelnes Zeichen überprüft, aber das kann man auch von hand machen.

Danach kannst du mit "atoi()" deinen String in eine int Variable wandeln.


mfg
umbrasaxum


----------



## MCIglo (10. November 2004)

```
if (i >= 0 && i <= 10000) {
//zwischen 0 und 10000//
}
else {
printf("du stinkst!\n");
exit(1);
}
```

So würde ich das machen


----------



## Tobias K. (10. November 2004)

moin


@MCIglo
Dein Programm sagt mir das "e" gültig ist! Ich glaub nciht das, das für cler ausreichend ist! Überleg dir noch mal ob du das so machen würdest. 


mfg
umbrasaxum


----------



## MCIglo (10. November 2004)

wenn du i als integer definierst?

```
#include <stdio.h>
int main() {
 int i=0;
 scanf("%i",&i);
 if (i >= 0 && i <= 10000) {
   //zwischen 0 und 10000//
 }
 else {
   printf("du stinkst!\n");
   exit(1);
 }
}
```
Ich kanns hier nicht testen, weil mein PC einfach so im A..imer is, dass nittmal VC++ richtig läuft. SOllte aber eigentlich gehn


----------



## Tobias K. (10. November 2004)

moin


Ja auch wenn ich i als Integer definiere.

Hab grad nochmal deinen neuen Code geteset und komme zu dem gleichen Fehler.


mfg
umbrasaxum


----------



## MCIglo (10. November 2004)

Tjo, dann halt doch so, wie dus gesagt hast. Bin halt selbst auch noch recht neu in C


----------



## Tobias K. (10. November 2004)

moin


Ich nehme an das das Programm bei deiner Variante den ASCI Wert vom "e" nimmt.
Der ist 101 und somit gültig.

Wenn man mitn Debugger das Programm überprüft weiss man genau woran es liegt, hab ich jetzt aber keine Lust zu....


mfg
umbrasaxum


----------



## cler (10. November 2004)

Hallo zusammen,

wenn ich das richtig sehe, liegt das Problem darin, dass wenn man eine Zahl einliest und überprüfen will, ob eine Zahl oder ein Buchstabe eingegeben wurde, dass eine Zahl für bestimmte Buchstaben intern steht. 106 z.B. glaube ich für n oder j. Richtig? Wenn jemand also zufällig 106 eingibt, was ja eigentlich vollkommen OK wäre, würde es der Rechner als Buchstaben nehmen!?
Gibt es da keine fertige Funktion für die das erledigt und true oder false wiedergibt....oder so etwas?

Grüße

cler


----------



## Tobias K. (10. November 2004)

moin


Zu deiner ersten Frage:
Ja 106 steht für das j. 110 für n.

Zu deiner zweiten:
Wenn ich in eine char Variable eine 1 eine 0 und eine 6 eingebe ist es kein e!
Wenn ich in eine int Variable hab mit dem Wert 106 und sie dann als char caste isses ein e!

Zu deiner dritten Frage:
Mir ist keine fertige Funktion bekannt die vom "Grundlegen Bibliotheken" mit geliefert wird und wenn dann machen sie eh nur das was meine Funktion macht. Kann dir aber gerne eine entsprechende Funktion schreiben.


mfg
umbrasaxum


----------



## Tobias K. (10. November 2004)

moin


Hier meine Version als Funktion:

```
#include <iostream>

using namespace std;

bool isZahl(int temp)
{
	char zahl[10];
	itoa(temp, zahl, 10);

         for( int i=0; i<5; i++)
		if ( ! ((int)zahl[i] > 47 && (int)zahl[i] < 85))
			return false;
	
	return true;
}


int main()
{
	int xxx;
	cin>> xxx;

	bool ergebnis = isZahl(xxx);

	if( ergebnis == true )
		cout<<"Es ist eine Zahl";

	if(ergebnis == false)
		cout<<"Es ist keine \"reine\" Zahl";

	return 0;
}
```

Für deine ansprüche reicht das auf jedenfall, wenn man es variabler haben will sollte man die Parameterübergabe optimieren.


mfg
umbrasaxum


----------



## RedWing (11. November 2004)

Wieso das Rad neu erfinden, wenn es schon mal gebaut wurde?


```
#include <iostream>

using namespace std;

int main(){

        int zahl = 0;
        char buf[20];
        cout << "Zahl?: ";
        cin >> buf;

        if(sscanf(buf, "%d", &zahl))
                cout << "Bingo " << zahl << "ist eine Zahl" << endl;
        else
                cout << "Ungültige Eingabe" << endl;
}
```

Gruß

RedWing


----------



## cler (11. November 2004)

hallo umbrasaxum,

ich habe gerade mal deinen Code getestet. Es ist egal, ob man eine Zahl oder einen Buchstaben drückt. Es kommt immer die Meldung, dass es keine reine Zahl sei. Leider ist das Programm auch in cpp, ich schreibe in c.
Scheint ja irgendwie nicht so einfach zu sein, um eine Zahl von einem anderen Zeichen zu unterscheiden.
Ich probier mal weiter.

Allen ersteinmal ein herzliches Dankeschön.

Grüße


----------



## Tobias K. (11. November 2004)

moin


Das ist merkwürdig da bei mir alles läuft! bin aber grad nciht zu Hause teste es nacher nochmal.

Und bis auf das cout, welches man durch printf ersetzen kann ist es reines C!


mfg
umbrasaxum


----------



## Tobias K. (11. November 2004)

moin


Bin nun wieder zu Haus eund hab es nochmal getestet und es Funktioniert.

Hast du es 1:1 von mir übernommen oder irgendwas geändert?


mfg
umbrasaxum


----------



## dorado (11. November 2004)

es gibt verschiedene Routinen für Zeichenklassifizierung
Unter anderem   isdigit(int c)


----------



## RedWing (11. November 2004)

cler hat gesagt.:
			
		

> Scheint ja irgendwie nicht so einfach zu sein, um eine Zahl von einem anderen Zeichen zu unterscheiden.
> Ich probier mal weiter.





			
				RedWing hat gesagt.:
			
		

> Wieso das Rad neu erfinden, wenn es schon mal gebaut wurde?
> 
> 
> ```
> ...


Augen auf beim Eierkauf...


----------



## dorado (11. November 2004)

sscanf funktioniert auch , wenn du mehr als nur eine Zahl eingegeben hast z.B. "1224 fdjfd".
Ist daher nicht geeignet.

Am besten ist alle eingegebenen Zeichen in einer Schleife zu prüfen.

@umbrasaxum
Nur so zur Info
Beim prüfen von Zeichen sollte man keine Zahlen verwenden, sondern lieber die characters dafür. Also '0' anstelle von 48. Das ist besser lesbar und weniger fehleranfällig.


----------



## Tobias K. (11. November 2004)

moin


@dorado
Klar gibt es Funktionen wie z.B. isdigit() die machen aber auch nichts anderes als ich. Außerdem hatte ich darauf schon hingewiesen.

Zu deiner "Info":
Da bin ich anderer Meinung. Besonders bei so kleinen Funktionen sollte das schon in Ordnung gehen.


mfg
umbrasaxum


----------



## cler (11. November 2004)

Hallo,

ich habe den folgenden code unter test.c gespeichert. Bekome dann immer den Fehler:

eh.h nur für c++.

```
#include <iostream>
using namespace std;

bool isZahl(int temp)
{
 char zahl[10];
 itoa(temp, zahl, 10);
         for( int i=0; i<5; i++)
  if ( ! ((int)zahl[i] > 47 && (int)zahl[i] < 85))
   return false;
 
 return true;
}

int main()
{
 int xxx;
 scanf(%i", &xxx);
 bool ergebnis = isZahl(xxx);
 if( ergebnis == true )
  printf("Es ist eine Zahl");
 if(ergebnis == false)
  printf("Es ist keine \"reine\" Zahl");
 return 0;
}
```


----------



## Tobias K. (11. November 2004)

moin


Du hast bei scanf(%i", &xxx); ein Anführungszeichen vergessen!
Weiss aber nciht ob es daran liegt.


Edit:
Mit Anführungszeichen Funktioniert das Programm bei mir!
Ohne kann ich es ncihtmal kompilieren.

Das könnte mit an deinem Compiler liegen, viele ältere bemerken solche Fehler oft nciht.


mfg
umbrasaxum


----------



## dorado (11. November 2004)

@cler

den Code kannst du auch abkürzen 

int main()
{
int xxx;
scanf(%i", &xxx);
printf("Es ist eine Zahl");
return 0;
} 

Da du ja sicher eine Zahl einliest, du speicherst sie sogar in einem int, wird dabei immer eine Zahl rauskommen.
Die Methode isZahl übernimmt ebenfalls einen int, was ja immer eine Zahl ist.


----------



## Tobias K. (11. November 2004)

moin


Hmm, auch wenn ich die Art wie du deinen letzten Beitrag geschrieben hast nicht gut finde, hast du dennoch recht.

Scheinbar wird eine Eingabe die in ein int soll direkt vor dem "nicht-numerischen" Zeichen abgeschnitten.

Deshalb hier meine neue Version:

```
#include <iostream>

using namespace std;

bool isZahl(char *cTemp)
{
	int i=0;

	while(cTemp[i] != '\0')
	{
		if ( ! ((int)cTemp[i] > 47 && (int)cTemp[i] < 85))
			return false;

		i++;
	}

	return true;
}


int main()
{
	char xxx[100];
	cin>> xxx;

	bool ergebnis = isZahl(xxx);

	if( ergebnis == true )
		cout<<"Es ist eine Zahl";

	if( ergebnis == false )
		cout<<"Es ist keine \"reine\" Zahl";


	return 0;
}
```

Hier wird die Benutzereingabe erstmal als String gespeichert, anscheinend kommt da nicht drum rum.


mfg
umbrasaxum


----------



## dorado (11. November 2004)

umbrasaxum hat gesagt.:
			
		

> Hmm, auch wenn ich die Art wie du deinen letzten Beitrag geschrieben hast nicht gut finde, hast du dennoch recht.


Entschuldige bitte, kam wohl anders an, als gemeint 

 

Dora


----------



## Tobias K. (11. November 2004)

moin


Eine Entschuldigung ist nicht nötig!
Bin nicht böse. 


mfg
umbrasaxum


----------



## cler (11. November 2004)

@umbrasaxum

hallo,

wenn ich deinen Code als .cpp speichere, compiliere und ausführe, kommt immer die Ausgabe, dass es keine reine Zahl sei, egal ob ich z.B. 10 eingebe oder w. Wenn ich es als *.c abspeichere geht es gar nicht. Er meckert dann, dass die eh.h nur für c++ sei.
Mache ich da was total falsch oder ....ich weiß auch nicht. Vielleicht muss ich erst einmal ne Nacht drüber schlafen.

Vielen Dank.

Grüße


----------



## Tobias K. (11. November 2004)

moin


Leider hast du noch nciht geschrieben welchen Compiler du benutzt, oder ich habs überlesen.


Aber da du das Programm ja in C schreiben willst, lass das #include <iostream> ganz weg und ersetze es durch #include <stdio.h>, aber das weisst du wohl.

Und lass das using namespace std; ganz weg!


mfg
umbrasaxum


----------



## Tobias K. (11. November 2004)

moin


Hier meine modifizierte C Version:

```
#include <stdio.h>
#include <conio.h>


bool isZahl(char *cTemp)
{
	int i=0;

	while(cTemp[i] != '\0')
	{
		if ( ! ((int)cTemp[i] > 47 && (int)cTemp[i] < 85))
			return false;

		i++;
	}

	return true;
}


int main()
{
	char xxx[100];
	scanf("%s", xxx);

	bool ergebnis = isZahl(xxx);

	if( ergebnis == true )
		printf("Es ist eine Zahl");

	if( ergebnis == false )
		printf("Es ist keine \"reine\" Zahl");

	getch();

	return 0;
}
```


So läuft es bei mir ohne Probleme.
Es müsste übrigens egal sein welche Endung de Datei mit dem Code hat, hauptsache der Compiler weiss welche Datei Compiliert werden soll.


mfg
umbrasaxum


----------

