IoResult ?
IoResult ?
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;
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;
Re: IoResult ?
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
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
Re: IoResult ?
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
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
Re: IoResult ?
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
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
Re: IoResult ?
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
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?
Re: IoResult ?
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
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
Re: IoResult ?
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
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
Re: IoResult ?
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
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
Re: IoResult ?
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
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
Re: IoResult ?
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
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
Re: IoResult ?
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
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