problem mit einlese



  • hallo, ich habe öfters dieses oder ein ähnliches problem mit der einlese in C.

    wenn ich das programm ausführe (netbeans) wird folgendes ausgegeben:

    Sie haben sich entschieden, das Spielfeld eigenhaendig zu befuellen.Geben Sie die entsprechenden Koordinaten des Feldes ein um es zu befuellen.
    + 0 1 2 3 4
    0 0 0 0 0 0
    1 0 0 0 0 0
    2 0 0 0 0 0
    3 0 0 0 0 0
    4 0 0 0 0 0
    X-Achse: Y-Achse:

    das einlesen der X-Achse wird übersprungen und auch die Y-Achse liest nicht richtig ein. erst nach der ersten eingabe (nach der ein clearscreen() folgt) funktioniert es richtig.

    hier die funktion:

    void manuellBefuellen(char lebensraum[FELD][FELD], int z, int s)
    {
            int i, y;
            int control=0;
            char ein[300];
            printf("Sie haben sich entschieden, das Spielfeld eigenhaendig zu befuellen."
            "Geben Sie die entsprechenden Koordinaten des Feldes ein um es zu befuellen.");
    
            while(control<=25)
            {
                    printf("\n+ 0 1 2 3 4\n");
                    for(y=0; y<5; y++)
                    {
                            printf("%d ", y);
                            for(i=0; i<5; i++)
                            {
                                    printf("%c ", lebensraum[y][i]);
                            }
                    putchar('\n');
                    }
                    printf("X-Achse: ");
                    if(!gets(ein))
                    {
                            break;
                    }
                    sscanf(ein, "%d", &s);
                    printf("Y-Achse: ");
                    if(!gets(ein))
                    {
                            break;
                    }
                    sscanf(ein, "%d", &z);
                    lebensraum[s][z]='X';
                    clearscreen();
            }
    }
    

    könnte mich jemand auf den fehler hinweisen und eine lösung vorschlagen? wie gesagt, dieser fehler passiert mir öfters.



  • Hi Bruder!

    Du willst den Benutzer 25 Koordinaten eingeben lassen, um das komplette Array mit ein und demselben Wert zu initialisieren?
    Hahahahaha! Wie doof ist das denn?! 🤡

    Gut, nehmen wir an es gibt Benutzer die Spaß daran haben :D,
    dann hätte ich noch den einen oder anderen Tipp:

    Die Funktion gets ist kagge, weil es deine Arrays sprengen kann benutze lieber fgets. http://www.google.de/search?hl=de&q=gets+buffer+overflow

    Die eingegebenen Koordinaten können dein Array zerfetzen, wenn sie >= FELD oder < 0 sind.
    Darum solltest du die Werte vorher checken und unsigned int benutzen.

    Die Funktion sscanf würde ich hier gar nicht benutzen, sondern direkt mit scanf einlesen - sscanf und scanf geben Werte zurück, das hat
    einen Grund: diese Rückgabewerte sollte man programmtechnisch beachten, um auf fehlerhafte Eingaben reagieren zu können.

    Das Einlesen der Koordinaten, sowie die Anzeige des Feldes würde ich jeweils in separate Funktionen auslagern.

    Kommen wir nun zu deinem eigentlichen Problem, LOL.
    Wenn irgendwelche Eingaben "übersprungen" werden, liegt es daran, das sich noch Daten im Eingabepuffer (wie ich hier bereits lesen durfte, fahren manche voll auf den Begriff Eingabestrom ab, obwohl da garnix strömt :D, sondern sich schön brav und regungslos im Speicher befindet,
    man könnte auch sagen gepuffert 😃 ist 🤡 SCNR) befinden.
    Die Gründe können sein: Eingabe passt nicht zum Formatstring der scanf-Funktion, oder das char-Array für fgets ist zu klein, oder es wurde mehr als ein Zeichen eingegeben, aber nur eins mit getchar eingelesen...
    Die Funktionen (fgets, scanf, getchar) können also aus oben genannten Gründen Daten im Eingabepuffer 😉 stehen lassen.
    Die sich im Eingabebuffer befindenden Daten werden dann aufgrund erneuter Aufrufe von fgets, gets, scanf, getchar, usw. eingelesen, obwohl der Benutzer gar nichts eingegeben hat. Das sieht für den C Anfänger dann so aus, als würde die Eingabe übersprungen werden. Comprendes amigo?



  • Die Benutzung von sscanf in Verbindung mit fgets (bitte kein gets) ist schon in Ordnung.

    Das Problem wird an einer Stelle vor deiner Funktion liegen.

    Ich rate mal:
    Entweder liest du nur ein einzelnes Zeichen ein (mit scanf oder getchar, oder du liest eine Zahl mit scanf ein.
    Beides mal bleibt der Code von der zur Eingabe benötigte Entertaste ('\n') im Eingabestrom stehen.
    Jedenfalls liest dein gets ein '\n' ein und somit ist deine X-Eingabe leer.

    Du kannst auch alles in einer Zeile einlesen.

    printf("X Y -Achse: ");
    fgets(ein, 300, stdin);
    if (2 == sscanf(ein, "%d%d", &s, &z))
      lebensraum[s][z]='X';
    

Anmelden zum Antworten