Bedingung anders formulieren
-
@hartmut
Ich prüfe ja scanf auf den Rückgabewert.
int a[5]; do { printf(); scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]); }while(a[0]<1 || a[0]>9 || a[1] usw.);
Hier prüfe ich ob der Wert zwischen 1 und 9 ist. Wenn ich eine größere Zahl eingebe funktioniert es auch. Das Problem ist wenn ich einen Buchstaben eingebe wie m wird das angeblich als 0 erkannt und die Arrays nach dem Buchstaben werden auch mit 0 befüllt.
Da weiß ich nicht wo das Problem ist. Wieso wird einem Buchstaben eine 0 zugewiesen und die restlichen Arrays auch mit 0 befüllt. Und das nächste Problem ist dass es bei scanf nicht wieder stehen bleibt für eine Eingabe sondern es passiert eine Schleife ohne abbruch.
-
pro schrieb:
@hartmut
Ich prüfe ja scanf auf den Rückgabewert.
Eben nicht:
int scanf ( const char * format, ... );
[...]
On success, the function returns the number of items succesfully read. This count can match the expected number of readings or fewer, even zero, if a matching failure happens.
-
Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.[cpp]scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
while ((c = getchar()) != '\n');[cpp]
-
Um die Reihen der Moeglichkeiten zu vervollstaendigen bliebe noch der Weg ueber eine verkettete Liste und eine doppelte Rekursion (auch als Stack-Stress-Test):
typedef struct NumberContainerSingle { int iNo; NumberContainerSingle *pNext = NULL; } bool IsDoubleSingle (NumberContainerSingle *pCurrent, int iNo) { if (pCurrent->iNo == iNo) return true; if (pCurrent->pNext != NULL) return IsDoubleSingle (pCurrent->pNext, iNo); else return false; } bool IsDouble (NumberContainerSingle *pCurrent) { if (pCurrent == NULL) return false; if (pCurrent->pNext != NULL) { if (IsDoubleSingle (pCurrent->pNext, pCurrent->iNo) == false) return IsDouble(pCurrent->pNext); else return true; } else return false; }
(Nur der Vollstaendigkeit halber) - Edit: Ist schon spaet ...
-
pro schrieb:
Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]); while ((c = getchar()) != '\n');
typedef struct NumberContainerSingle { int iNo; NumberContainerSingle *pNext = NULL; } NumberContainerSingle *ReadNoIn (void) { char cChar = 'X'; bool fEnd = false; NumberContainerSingle *pReturn = NULL, *pCurrent = NULL, *pTemp; do { do { cChar = getc (); if (cChar == '/n') fEnd = true; } while ((cChar >= '0') && (cChar <= '9') && (fEnd == false)) if (fEnd == false) { pTemp = malloc (sizeof (NumberContainerSingle)); if (pTemp == NULL) { fprintf (stderr, "No Heap\n"); abort (); } else if (pReturn == NULL) pReturn = pTemp; else pCurrent->pNext = pTemp; pCurrent = pTemp; pCurrent->iNo = cChar - '0'; } } while (fEnd == false); return pReturn; }
-
Doppelt
-
pro schrieb:
Mein Problem ist dass ich jetzt 2 mal Enter drücken muss anstatt 1 mal.
Wenn ich mehr Zahlen als 5 eingebe, ist es kein Problem jedoch wenn ich nur 2 Zahlen drücke und dann Enter bleibt das Programm hängen.[cpp]scanf("%d %d %d %d &d", a[0], a[1], a[2], a[3], a[4]);
while ((c = getchar()) != '\n');[cpp]feherhafter code.
%d und nicht &d, &a[n] und nicht a[n]
-
Danke für die Antworten.
@hartmut
Tut mir leid aber ich kann aus deinem Code sehr wenig herauslesen.
@problemerkenner
Das waren nur Tippfehler.So sieht der Code aus. Ich habe wie schon erwähnt diese Zeile eingefügt
while ((c = getchar()) != '\n');
. Das Problem ist, seitdem ich diese Zeile hinzugefügt habe muss ich am Ende 2x Enter drücken. Ich glaube das hat etwas mit dem Puffer zu tun.
Und wie schon erwähnt bei scanf wenn ich jetzt mehr Zahlen eintippe wird der Puffer einfach geleert. Aber wenn ich nur 2 anstatt der 5 Zahlen eintippe und Enter drücke bleibt das Programm hängen. Wahrscheinlich weil es noch auf die restlichen scanf wartet.
Kann man das irgendwie ausbessern. Wenn ich nur 2 anstatt 5 Zahlen eingebe und Enter drücke soll es im Programm weitermachen.
. . . . do { printf ("\n"); scanf ("%d %d %d %d %d", &a[0], &a[1], &a[2], &a[3], &a[4]); while ((c = getchar()) != '\n'); . . . printf ("Spiel wiederholen, \"Enter\" drücken!\n\n"); getchar(); scanf ("%c", &enter); } while (enter=='\n');
-
Jepp, scanf wartet auf die restlichen Zahlen. Nimm fgets und sscanf.
Gruß,
B.B.
-
pro schrieb:
Danke für die Antworten.
@hartmut
Tut mir leid aber ich kann aus deinem Code sehr wenig herauslesen.
Was ist da unklar?