IoResult ?

Post Reply
Message
Author
Felix Gertz

IoResult ?

#1 Post by Felix Gertz »

Wie kann ich unter C eine IOResult Abfrage machen?

int a;
a=getchar();

Wenn ich hier z.B. k eingebe, also keine Ziffer, dann flippt er aus!

Unter Pascal könnte man das so unterbinden:
var a:integer;
{I+}a:=readkey;{I-}
If IoResult <> 0 then fehler;

andib
Posts: 277
Joined: 20. Jun 2000 14:18
Location: Dortmund

Re: IoResult ?

#2 Post by andib »

Hast du mal ne ASCII Tabelle parat?

Probier mal
printf("%d", a);
und vergleiche!

Ergebnis: bei Eingabe von '2' bekommst du 50 - siehe ASCII.

Pascal kann ich leider nicht und weiss daher nicht was dieses IOResult sein soll, aber ich nehme mal an du willst prüfen, ob da eine Zahl eingegeben wurde. Zahlen liegen in der ASCII Tabelle bei 48 - 57, also sollte ein

a -= 48;
if (a >= 10)
printf("error - keine Zahl");

reichen.

CU
Andi

Felix Gertz

Re: IoResult ?

#3 Post by Felix Gertz »

Das Problem ist ja das er dabei komplett abdreht...
Ich kann also garnix mehr prüfen.

Hier, probiere selber:

int mitspieler;
do
{
printf("Wie viele Mitspieler (2-10) ? ");
scanf("%d",&mitspieler);
} while((mitspieler<2) || (mitspieler>10));

Solange ich nur Zahlen eingebe ist alles palletti.

Unter Pascal kann man einer Integer Variable keinen Char/String zuweisen.
Das Programm würde abstürtzen.
Dies kann man verhindern indem man eine IOResult Abfrage macht.

Grüsse

Flix

andib
Posts: 277
Joined: 20. Jun 2000 14:18
Location: Dortmund

Re: IoResult ?

#4 Post by andib »

scanf? Ich denke es geht um getchar?
Na ja, egal.
Mit scanf hab ich nur wenig Erfahrung. Als die Probleme anfingen bin ich mit Vollgas auf C++ umgestiegen und hab mich lieber mit cin rumgeärgert ;)
Du könntest mal versuchen:

do {
printf("Wie viele Mitspieler (2-10) ? ");
char s[ 2 ];
scanf("%s", s);
if (s[ 0 ] == 49 && s[ 1 ] == 48)
mitspieler = 10; // 1. Zeichen == 1; 2. Zeichen == 0
else if (s[ 0 ] - 48 <= 9 && s[ 1 ] == '\0')
mitspieler = s[ 0 ] - 48;
} while(mitspieler < 2 || mitspieler > 10);

Du prüfst also zuerst, ob in dem string (= char array) mehr 2 Zeichen eingegeben wurde (s[ 1 ] != '\0') und verlangst dann, dass das eine 10 ist. ansonsten prüfst du, ob eine Zahl eingegeben wurde. Bei mir läuft das.
Aber scanf kann ich sowieso nicht leiden ;)

BTW: weiss jemand wie man beim Ultraboard eckige Klammern schreibt, ohne dass die Nachricht total verhunzt wird??

CU
Andi

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: IoResult ?

#5 Post by hjb »

Hi,

oje, Pascal...

in C liefern die meisten Funktionen (jedenfalls die der C-Library) ein Resultat zurück. Im Fehlerfall ist das meist -1 (NULL bei Funktionen, die Pointer liefern). Die Variable errno enthält dann einen genauen Fehlercode, was in etwa dem IOResult entspricht. errno darf aber nur im Fehlerfall abgefragt werden. Wenn die Funktion erfolgreich war, muß man davon ausgehen, daß in errno etwas undefiniertes steht.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Felix Gertz

Re: IoResult ?

#6 Post by Felix Gertz »

Es ist völlig egal ob ich getchar oder scanf.
Deine Methode funktioniert leider auch nicht.

Das Problem ist, er landet meistens in einer Endlosschleife..
Wie viele Mitspieler (2-10) ?
Wie viele Mitspieler (2-10) ?
Wie viele Mitspieler (2-10) ?
Wie viele Mitspieler (2-10) ?
Wie viele Mitspieler (2-10) ?

Aber mir ist was aufgefallen...

Wenn ich die Schleife entfehrne, dann wird die nächste Eingabe übersprungen.

Es sieht ganz so aus als würde der Buffer nicht gelert werden, oder?

Unter C++ würde ja wahrscheinlich cout.flush(); helfen.
Nur leider Programmiere ich nicht unter C++.

Felix

andib
Posts: 277
Joined: 20. Jun 2000 14:18
Location: Dortmund

Re: IoResult ?

#7 Post by andib »

Bei mir funtioniert das. Allerdings sieht das dann so aus:

Wie viele Mitspieler (2-10) ? l
Wie viele Mitspieler (2-10) ? ddd
Wie viele Mitspieler (2-10) ? 8568
Wie viele Mitspieler (2-10) ? foo
Wie viele Mitspieler (2-10) ? 3

-> Die Schleife wird solange wiederholt, bis eine gültige Zahl eingegeben wurde.


> Es sieht ganz so aus als würde der Buffer nicht gelert werden, oder?

Meinst du die Input Variable? Die wird jedesmal überschrieben. Bei scanf("%s", xyz); wird außerdem am Ende als letztes Zeichen ein '\0' angefügt, soweit Platz ist.

Könnte es evtl. am Compiler liegen? Welchen benutzt du? Ich benutze hier den g++. Am Anfang habe ich ausserdem ein #include <stdio.h>.

CU
Andi

Felix Gertz

Re: IoResult ?

#8 Post by Felix Gertz »

Ich meine natürlich die Input Variable.

Ich benutze gcc -Wall (Er sagt nix besonderes).
Ausserdem binde ich ein
<stdio.h> <stdlib.h>

Aber sowas passiert bei mir:

scanf("%d",&a);
scanf("%d",&b);

Wenn ich nun keine Zahl eingebe, dann wird einfach das 2. Scanf übersprungen.
Woran kann sowas liegen?

Danke

Felix

andib
Posts: 277
Joined: 20. Jun 2000 14:18
Location: Dortmund

Re: IoResult ?

#9 Post by andib »

Hmmm bei mir auch (aber die Schleife funktioniert hier trotzdem)

Was du machen könntest:

char a, b;
scanf("%c", &a);
scanf("%c", &b);
int a2, b2;
a2 = a - 48;
b2 = b - 48;

Nicht schön, aber ich weiss nix besseres. Aber bedenke, dass du nur mit einzelnen Zeichen arbeitest - für 2 Stellige Zahlen brauchst du wieder obigen Array.

CU
Andi

Felix Gertz

Re: IoResult ?

#10 Post by Felix Gertz »

Hmm schade..

Das wäre jetzt natürlich arg umständlich.
Ich habe auch noch Eingaben mit 5 stelligen und mehr Zahlen.

Ich habe das Gefühl andere haben nie solche Probleme, warum? ;)

Kann doch nicht sein, daß man das wirklich so ,wie Du vorschlägst, machen muss.

Na ja
Grüsse

Felix

andib
Posts: 277
Joined: 20. Jun 2000 14:18
Location: Dortmund

Re: IoResult ?

#11 Post by andib »

Kann ich mir auch nicht vorstellen (wie gesagt ich bin früh auf C++ umgestiegen, das war nur das einzige was mir einfiel)

Mein schlaues Buch sagt hier folgendes:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
char zeile[20]; // oder wie lang auch immer ;)
int a = 0, b = 0;
fgets(zeile, sizeof(zeile), stdin);
sscanf("%d\<!--no-->n", &a);
fgets(zeile, sizeof(zeile), stdin);
sscanf("%d\<!--no-->n", &b);
</font><hr></pre></blockquote>

-> scheint zu funktionieren (und ist auch schöner ;))

CU
Andi

Post Reply