Fehler beim Einlesen eines Strings mit scanf()



  • Hallo!

    Ich bin neu hier und mache gerade meine ersten Programmierübungen in C.
    Mit der Funktion scanf() möchte ich einen String einlesen und diesen anschließend wieder ausgeben. Das funktioniert soweit auch, aber wenn ich zum Schluss ENTER drücke um das Konsolenfenster zu schließen bekomme ich den Fehler

    Run-Time Check Failure #2 - Stack around the variable 'text' was corrupted.

    Ich verwende Microsoft Visual Studio 2010. Weis jemand, wo hier der Fehler liegt? 😕

    Hier der Code:

    #include <stdio.h>
    #include "stdafx.h"
    
    void main(void) 
    {
       char text;
    
       printf("Bitte geben Sie eine Zeichenkette ein! ");
       scanf("%s", &text);
       printf("Eingegeben: %s",&text);
       fflush(stdin); 	//Tastaturpuffer löschen
    
       getchar();
    }
    


  • Schau noch mal wie ein String in C aussehen muss

    char text;
    

    <= Einzeichen-Text ist sicher nicht was du möchtest 😉

    scanf("%s", &text);
    

    <= bei Strings da kein &

    MfG f.-th.



  • text ist als char definiert. Als ein char.
    So ein String besteht aber aus mehr Zeichen. Darum brauchst du ein Array.



  • Super, Danke!

    Ich habe das nun wie unten im Code ausgebessert 😃

    Wie lese ich aber am besten einen String ein, wenn ich nicht weis, wieviele Zeichen der Benutzer eingibt?

    void main(void) 
    {
       char text[5];
    
       printf("Bitte geben Sie 4 Zeichen ein! ");
       scanf("%s", text);
       printf("Eingegeben: %s",&text);
       fflush(stdin); 	//Tastaturpuffer löschen
    
       getchar();
    }
    


  • Du kannst mit dem Array auch großzügiger sein

    char text[1001];
    
       printf("Bitte geben Sie 4 Zeichen ein! ");
       scanf("%1000s", text); // liest maximal 1000 Zeichen bis zum ersten Whitespace ein
    

    oder besser, da du auch Leerzeichen einlesen kannst:

    scanf("%1000[^\n]", text); // liest maximal 1000 Zeichen ein
    

    bzw.:

    fgets (text, 1001, stdin);
    

    Wenn du beliebig viele Zeichen einlesen willst, musst du die einzeln (mit getchar()) einlesen und im (dann dynamischen besorgten) Speicher ablegen.



  • DirkB schrieb:

    Wenn du beliebig viele Zeichen einlesen willst, musst du die einzeln (mit getchar()) einlesen und im (dann dynamischen besorgten) Speicher ablegen.

    Wenn Du aber ein C-Programm schreibst, das (am besten noch in der Console) 1000 Zeichen Eingabe ohne return-Taste übersteigt, solltest Du das Konzept überarbeiten oder dir geistig gesunde Anwender suchen 😉
    Und 1 kb Speicher ist in der heutigen Zeit wohl eher nicht mehr das Problem.



  • ledi schrieb:

    fflush(stdin); 	//Tastaturpuffer löschen
    

    Das kannst du so nicht machen. fflush() ist für Inputstreams nicht definiert.

    ISO-C1X, 7.21.5.2 schrieb:

    If stream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

    Was du da machst, ist also kein korrektes C. Du müsstest dir also die noch im Stream befindlichen Daten manuell rausziehen.



  • Ok!
    Und wie geht das?
    Kannst du mir dazu ein Beispiel geben?



  • Das steht in der FAQ vom Unterforum. Zu erreichen durch die Dropdown-Liste im Kopfbereich vom Unterforum (FAQ Index)
    Oder direkt unter http://www.c-plusplus.net/forum/p1146014#1146014



  • Gib mal hier im Forum in der Suche:

    fflush(stdin);
    

    ein. Da sollte in den ersten Beiträgen etwas dazu stehen.

    Wenn du schon dabei bist,

    void main(...
    

    ist nicht vom Normenausschuss abgesegnet. Nimm besser:

    int main(...
    

    😃

    MfG f.-th.



  • Also wenn ich das jetzt richtig verstanden habe:

    while ((c = getchar()) != EOF && c != '\n');
    

    Solange c kein End of file ist und keine ENTER-Taste gedrückt wurde, hole alles aus dem Puffer und speichere in c?



  • Ja.



  • Das wichtig(st)e dabei ist aber auch, dass das '\n' (die Enter-Taste) auch ausgelesen wird.
    Das macht das scanf() nämlich nicht.


Log in to reply