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);
    mit intEingabewert , wenn du gleich Enter drückst?
    Und dazu nochmal die erste Frage zu intRueckgabewert_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? 🙂


Anmelden zum Antworten