scanf und gets funktionen arbeiten zusammen ein bisschen wirr



  • Ist es normal, dass sich die beiden Funktionen scanf und gets beißen ??

    Ich schilder mal mein Problem:
    Wenn ich irgendwo scanf benutze, dann reagiert die erste gets-funktion nicht richtig.

    Ein Bsp:

    #include <stdio.h>
    #include <conio.h>
    
    void main(void) {
      char *string="            "; //um eine Speicherstelle festzulegen
      int integer;
    
      puts("Eingabe mit scanf:");
      scanf("%d", &integer);
    
      puts("Eingabe mit gets:");
      gets(string);    // <- dieser Befehl wird bei mir einfach übersprungen
                       //    oder nicht korrekt ausgeführt
    
      puts("Programmende");
      getch(); //zum Anhalten des Progs
    
    }
    

    Wie schon gezeigt: das erste gets hinter einem scanf funktioniert nicht. Das zweite gets allerdings wird widerum korrekt ausgeführt.

    Wenn man zB die scanf Funktion wegkommentieren würde, funktioniert die gets einwandfrei.

    Woran liegt das??

    Ich hoffe, ich habe mein Problem genau genug erkären können

    Ich arbeite mit Borland C++ Builder 6
    heimschmiede



  • das Problem ist, dass sich noch ein '\n' im Tastaturbuffer befindet, weil du das mit scanf nicht ausliest.

    Btw.
    1. solltest du gets nicht mehr benutzen, da es ein Sicherheitsproblem hat (warum das nicht endlich mal aus dem Standard entfernt wird oder zumindest dein Compiler eine Warnung ausgibt 🙄 )

    2. BCB ist nen C++ Compiler und kein C Compiler



  • Heimschmiede schrieb:

    void main(void) {
      char *string="            "; //um eine Speicherstelle festzulegen
    

    Vorsicht, Du solltest jetzt nicht schreibend auf string[0] ff zugreifen.



  • Jo, danke für die Antworten.

    @ kingruedi :

    kingruedi schrieb:

    solltest du gets nicht mehr benutzen ...

    Welche Funktion sollte man am besten benutzen? oder: welche benutzt ihr?

    @ Daniel E :

    Daniel E. schrieb:

    Vorsicht, Du solltest jetzt nicht schreibend auf string[0] ff zugreifen.

    Warum nicht ??

    -Ich bin noch ein neu in C und komme aus der einfachen Welt von Visual Basic.

    heimschmiede



  • fgets, ist die bessere Alternative, du übergibst fgets, ein Zeiger, die Anzahl der
    maximalen Zeichen und den Stream, für die Tastatur wäre das z.B.:

    char *string [80];
    fgets (string, 80, stdin);
    

    Allerdings liest es das Newline-Zeichen mit ein, die Funktion liest entweder
    bis ein Newline vorkommt, oder 80-1 zeichen eigegeben worden sind, der String
    wird mit '\0' beendet, wie es sich gehört.



  • Heimschmiede schrieb:

    kingruedi schrieb:

    solltest du gets nicht mehr benutzen ...

    Welche Funktion sollte man am besten benutzen? oder: welche benutzt ihr?

    fgets

    Heimschmiede schrieb:

    Daniel E. schrieb:

    Vorsicht, Du solltest jetzt nicht schreibend auf string[0] ff zugreifen.

    Warum nicht ??

    Weil " " eine StringKONSTANTE ist, und Du nur einen Zeiger auf diese Konstante erstellst. Schreibst Du aber:

    char string[]="            ";
    

    So erhaeltst Du eine beschreibbare Kopie dieser Konstante.

    <edit>Quoting korrigiert</edit>



  • Danke für die ganzen Antworten.
    eine letzte Frage zum Thema:
    wie bekomme ich am einfachsten und am schnellsten das "neue Zeile" Zeichen, dass mit fets in den String gekommen ist, wieder heraus?

    heimschmiede



  • char str[10];
    fgets(str,10,fh);
    str[strlen(str)]=0;
    

    oder schneller sollte sein

    *strrchr(str,'\n')=0;
    

    schade, dass fgets nicht die Anzahl der gelesenen Zeichen zurueckgibt, dann koennte man das noch besser machen.



  • kingruedi schrieb:

    char str[10];
    fgets(str,10,fh);
    str[strlen(str)]=0;
    

    Nene, da fehlt noch ein -1 (natürlich immer unter der Voraussetzung, daß ein '\n' drin ist. Das muss ja nicht sein.)


Anmelden zum Antworten