Problem mit gets() und größe der deklarierten Zeichenkette



  • Hallo miteinander,

    folgendes Problem: Ich will, dass der eingegebene Name maximal 4 Zeichen lang ist (siehe deklarierte Zeichenkette). Nun kann ich aber mit dem unten beschriebenen Programm mehr als 4 Zeichenketten eingeben.

    Es sollte ca so aussehen

    Name eingeben: Mustermann
    Name: Must

    Die (ungewollte) Ausgabe ist aber
    Name eingeben: Mustermann
    Name: Mustermann

    Wo liegt der Fehler, was mache ich falsch??

    main() {
    
    	char str[5];
    	printf("Name eingeben:");
    	gets(str);
    	printf("Name: %s", &str);
    }
    

    Vielen Dank!



  • kurisuchan schrieb:

    Wo liegt der Fehler, was mache ich falsch??

    Du benutzt gets

    Da das auch eine Sicherheitslücke ist, gilt gets auch als deprecated

    Du kannst fgets nehmen, aber das speichert auch (wenn Platz ist) das '\n' von der Entertaste mit ab.

    fgets(str,5,stdin);
    

    Oder scanf mit Ausnutzung der Möglichkeiten der Formatspecifier:

    scanf("%4s", str);
    

    Beachte die Unterschiedlichen Angaben für die maximale Anzahl Zeichen (einmal 5 und einmal 4)



  • DirkB schrieb:

    Du kannst fgets nehmen, aber das speichert auch (wenn Platz ist) das '\n' von der Entertaste mit ab.

    fgets(str,5,stdin);
    

    Es darf auch etws mehr sein ...

    int c; 
    char str[5];
    fgets(str,5,stdin);
    str[4] = (char)0;
    while (((c = getchar()) != EOF) && (c != '\n'));
    

    Der Code räumt den Rest bis zum Zeilenende noch weg.



  • Also, dann doch eher:

    char *p;
    int c;
    char str[5];
    fgets(str,5,stdin); // Rückgabewert sollte selbstverständlich auch überprüft werden
    if ((p = strchr(str, '\n')) != NULL)
    	*p = '\0'; // weg mit '\n' wie bei gets()
    else
    	while (((c = getchar()) != EOF) && (c != '\n'));
    


  • Die Zuweisung der 0 an die letzte Stelle ist unnötig (macht fgets schon)
    Und wenn weniger als 4 Zeichen eingegeben werden wartet der Code unötig auf ein 'n'



  • Ups, da war EinGast schneller 👍



  • DirkB schrieb:

    Die Zuweisung der 0 an die letzte Stelle ist unnötig (macht fgets schon)
    Und wenn weniger als 4 Zeichen eingegeben werden wartet der Code unötig auf ein 'n'

    Die 0 sicherzustellen ist (möglicherweise) etwas paranoid ..

    Wo wird unnötig gewartet ? Auf Stringende muss immer geprüft werden. Ob man sicherstellt, das vor der
    nächsten Eingabe der Puffer leer ist kommt auf die Anwendung an.

    Zeilenendezeichen löschen ist eine gute Idee.

    👍 EinGast



  • merano schrieb:

    Wo wird unnötig gewartet ?

    In deiner while -Schleife nach dem fgets

    DirkB schrieb:

    .. wenn weniger als 4 Zeichen eingegeben werden

    Denn dann steht das '\n' schon in str

    merano schrieb:

    Auf Stringende muss immer geprüft werden.

    Dann doch aber auch in der schon erfolgten Eingabe. So wie EinGast es vorgemacht hat.


Anmelden zum Antworten