PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehleingabe abfangen (in C)


DOOM
2005-04-23, 17:51:31
Mein Prob.:

Ich lese eine Integer Variable ein. Es darf z.b. keine 0 sein. Ich habe schon versucht die Eingabe mit einer while-Scheife so lange zu wiederholen bis die Eingabe korrekt ist. Sprich Abbruchvar. durch if-Anweisung setzen.

if( (var>=1) && (var<=sizeof(int)) )

So löse ich zwar das Problem mit der 0, aber wenn der DAU z.B. ein 'a' etc. eingibt, funktioniert es nicht.

Ideen?

maximAL
2005-04-23, 17:56:47
äh, was soll denn das sizeof(int)? dir ist schon klar, dass das die größe eines integers ausspuckt und in deinem fall wohl immer 4(byte) ergeben sollte?

Neomi
2005-04-23, 20:05:44
Wie wandelst du denn die Eingabe in einen Integer, daß ein 'a' Probleme machen kann? Soll es einen Maximalwert geben? Auf keinen Fall solltest du sizeof() verwenden, der Operator gibt immer nur den benötigten Speicherplatz eines Typs wieder und hat absolut nichts mit dessen Inhalt zu tun.

Exxtreme
2005-04-23, 20:12:38
Mein Prob.:

Ich lese eine Integer Variable ein. Es darf z.b. keine 0 sein. Ich habe schon versucht die Eingabe mit einer while-Scheife so lange zu wiederholen bis die Eingabe korrekt ist. Sprich Abbruchvar. durch if-Anweisung setzen.

if( (var>=1) && (var<=sizeof(int)) )

So löse ich zwar das Problem mit der 0, aber wenn der DAU z.B. ein 'a' etc. eingibt, funktioniert es nicht.

Ideen?
Lies die Chose am besten mit getch() ein und prüfe anhand einer ASCII-Tabelle, welche ASCII-Werte du zulassen möchstest.

DOOM
2005-04-23, 22:21:12
äh, was soll denn das sizeof(int)? dir ist schon klar, dass das die größe eines integers ausspuckt und in deinem fall wohl immer 4(byte) ergeben sollte?

Ups, ok mein Fehler!

Wie wandelst du denn die Eingabe in einen Integer, daß ein 'a' Probleme machen kann? Soll es einen Maximalwert geben?

Also ich lese einen Integer Wert mit scanf("%i", &variable); ein. Wenn der Anwender aber 'a' eingibt ensteht halt das Prob. das ich nicht richtig erfassen kann. Der Wertebereich soll halt von 1 bis (das was INT hergibt sein)!

Lies die Chose am besten mit getch() ein und prüfe anhand einer ASCII-Tabelle, welche ASCII-Werte du zulassen möchstest.

Dann habe ich das Problem das getch() ja nur EINEN Wert einlesen würde. Was wenn der Anwender '123' eingibt? Der Befehl wäre ja bei der 1 schon abgearbeitet! Man könnte natürlich so ein Hilfsstring einführen aber ist alles so aufwendig.

Da muss doch eine einfachere Lösung möglich sein!? Eine Überprüfung ob der eingegebene Wert ein gültiger Int-Wert ist...

Exxtreme
2005-04-24, 12:45:34
Dann habe ich das Problem das getch() ja nur EINEN Wert einlesen würde. Was wenn der Anwender '123' eingibt? Der Befehl wäre ja bei der 1 schon abgearbeitet! Man könnte natürlich so ein Hilfsstring einführen aber ist alles so aufwendig.

Da muss doch eine einfachere Lösung möglich sein!? Eine Überprüfung ob der eingegebene Wert ein gültiger Int-Wert ist...
Also ich hätte es tatsächlich mit einem Hilfsstring gemacht. :)

Mit getch() den eingegebenen Buchstaben prüfen ob es eine Zahl ist, wenn ja -> in den String, wenn nein -> verwerfen. Wenn dann der ASCII-Wert 13 kommt (Return), den Hilfsstring umwandeln in eine Integer-Zahl.

Matrix316
2005-04-24, 14:07:56
Gibts unter c

isdigit()

?

http://www.mkssoftware.com/docs/man3/isdigit.3.asp

Gast
2005-04-24, 16:35:56
int i = 0, result = 0;
while(result == 0)
{
printf("Bitte Eingabe von einer Zahl: ");
result = scanf("%i",&i);
if(result != 0 || result == EOF)
printf("Eingabe war: %i",i);
else
{
printf("Falsch Eingabe\n");
fseek( stdin, 0, SEEK_END);
}
}

DOOM
2005-04-24, 17:19:32
IT WORKS!!! thx

DOOM
2005-04-24, 17:45:29
aber @gast:
Haste auch eine Erklärung? :)

was hat den scanf für einen rückgabewert?
und die Zeile
fseek( stdin, 0, SEEK_END);
verstehe ich überhaupt nicht!

SGT.Hawk
2005-04-24, 21:17:24
Also,der Rückgabewert von scanf() gibt die Anzahl der gelesenen Zeichen zurück!

Gruss Hawk

DOOM
2005-04-24, 21:40:09
NEIN, das kan ich nicht bestätigen! Hab mir die Variable ausgeben lassen!

Bei '1' --> 1
Bei '122' --> 1
Bei 'a' --> 0

Aqualon
2005-04-24, 22:22:48
scanf("%i",&i); sorgt in dem Fall dafür, dass das eingelesene in einen int-Wert umgewandelt wird. Wenn du also keinen eingibst gibt er 0 aus, ansonsten 1.

fseek(stdin, 0, SEEK_END); sollte den Zeiger, den scanf benutzt wieder auf den Anfang zurücksetzen, aber genau versteh ich das auch noch nicht (bin auch erst C-Anfänger).

Aqua

Gast
2005-04-25, 07:52:54
scanf, wscanfSee Also
fscanf | printf | sprintf | sscanf

...

Return Values
Both scanf and wscanf return the number of fields converted and assigned; the return value does not include fields that were read but not assigned.

A return value of 0 indicates that no fields were assigned.

The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.

----

fseek mit SEEK_END bringt uns ans Ende des Input Streams, also überspringen wir alle Eingaben die wir noch nicht eingelesen haben (z.B. "a").