Aus stdin lesen
-
Hallo zusammen! Ich sitze gerade vor folgender Problemstellung:
Es werden Int-Werte für eine Struktur abgefragt. Ich möchte dem User die Möglichkeit geben mit "ENTER" vorgespeicherte Werte als Eingabe zu übernehmen. Andernfalls soll ganz normal der jeweile Wert abgefragt werden.
Ich habe es mit fgets probiert aber es wird immer übersprungen! Habe versucht mit getchar() zu basteln, aber dann habe ich einen getrennten Wert in zwei Variablen. Ich bitte um Hilfe. Hier mein Ansatz, ohne die Möglichkeit zu vor ENTER zu drücken:
#include<stdio.h> #include<stdlib.h> #define MIN 10 #define MAX 100 int getInt(char *pchFragetext, int intNummer); struct sData { int intFeld[20][20]; int inthase, intlebenszaehler; unsigned int intfuchs; double dblnachwuchs_hase, dblnachwuchs_fuchs; }; void main(void) { struct sData sData; typedef struct sData tData; tData *pData= &sData; pData->inthase= getInt("Anzahl Hasen(Standartwert \"100\" mit ENTER):",1); } int getInt(char *pchFragetext, int intNummer) { int intEingabewert=0, intRueckgabewert_Eingabe=0, FehlerMerker=0, intzweitestelle; char search; do { // Tastaturpuffer leeren fflush(stdin); printf("%s", pchFragetext); // Aufruf der einzelnen Fragetexte intRueckgabewert_Eingabe = scanf("%d%c",&intEingabewert, &search); /* Überprüfung auf Fehleingaben*/ if(intRueckgabewert_Eingabe == 2 || intRueckgabewert_Eingabe != 2) { if(search != 10) { printf("\nUng%cltige Eingabe!\n\n",129); fflush(stdin); FehlerMerker++; } if(intEingabewert >= MIN && intEingabewert <= MAX && search == '\n') { FehlerMerker =0; search=0; return intEingabewert; } if(intEingabewert < MIN || intEingabewert > MAX ) { printf("\nUng%cltiger Wertebereich!(MIN=10, MAX=100)\n\n",129); FehlerMerker++; } } }while(FehlerMerker !=0); // Verwiederholung bei Fehleingabe return EXIT_SUCCESS; }
-
Welchen Wert hat denn
intRueckgabewert_Eingabe
wenn du gleich Enter (ohne Werteeingabe) drückst?Was passiert bei
intRueckgabewert_Eingabe = scanf("%d", &intEingabewert);
mitintEingabewert
, wenn du gleich Enter drückst?
Und dazu nochmal die erste Frage zuintRueckgabewert_Eingabe
.
-
intRueckgabewert_Eingabe
ist der Rückgabewert von scanf. wenn man nur enter drückt passiert nichts, scanf wartet bis was eingegeben wurde
-
Bitschieber schrieb:
void main(void) /* standardinkonformer Anfänger-Müll */ struct sData sData; /* völlig verunglückter Anfängerversuch eines Datendesigns */ typedef struct sData tData; pData->inthase= getInt("Anzahl Hasen(Standartwert \"100\" mit ENTER):",1); /* muss Standard heißen */ fflush(stdin); /* standardinkonformer Anfänger-Müll zur Eingabepufferlöschung, siehe FAQ wie man es richtig macht */ intRueckgabewert_Eingabe = scanf("%d%c",&intEingabewert, &search); /* untauglicher Versuch zur Eingabepufferlöschung, zwar irgendwo (richtig) abgeschrieben, trotzdem Müll */
-
Mh, also gleich sagen das alles Müll ist einfach
schließlich hast du auch mal angefangen! Das mit dem fflush habe ich nachgelesen, wusste ich bis gerade nicht
aber ist ne schicke die Alternative! Nur hat wer eine Lösung für mein Problem?
-
Lies einen String mit fgets ein. Wenn er nur ein Zeichen enthält ('\n') übernimmst du den Vorgabewert, sonst wandelst du die Eingabe mit sscanf oder strtol.
Was soll eigentlich das:
if(intRueckgabewert_Eingabe == 2 || intRueckgabewert_Eingabe != 2)
-
ist eig. unnötig! ist verbessert
Ah okay also strtol mach mir aus meinem string wieder eine int-Zahl mit vorzeichen. und ob nur ein zeichen drin ist kann über strlen prüfen, stimmts?