scanf / fgets / gets



  • Hallo Leute!

    Ich ärgere mich heute schon ziemlich lange über ein Problem:

    Ich will einen String einlesen, allerdings klappt das ja mit scanf nicht (ich müsste nämlich einen Namen, der Leerzeichen inkludiert einlesen).

    Also würde ich gerne fgets bzw. gets verwenden....

    Mein Programmteil schaut folgendermaßen aus:

    #define MAX_NAME_SIZE 50
    
    ...
    
    printf("\nBitte Matrikel-Nr. eingeben: ");
    scanf("%lf", &matnr);
    
    printf("Bitte Namen eingeben: ");
    fgets(name, MAX_NAME_SIZE, stdin);
    

    danach werden diese 2 variablen (matnr und name) einer Funktion übergeben usw.

    Meine Ausgabe sieht jedoch folgendermaßen aus:

    Bitte Matrikel-Nr. eingeben: 123
    Bitte Namen eingeben:
    Der Eintrag wurde erfolgreich mit dem Index 152 angelegt...

    d.h. das fgets wird einfach übergangen...

    Kann mir wer sagen woran das liegt?

    Bei einem zweiten Beispielprogramm aus dem Internet tritt der selbe Fehler auf:

    #include <stdio.h>
    #include <string.h>
    
    #define MAX 10
    
    int main(int argc, char* argv[])
    {
          char vorname[21];
    
          printf("Vorname mit scanf(): ");
          scanf("%20s", vorname);
    
          printf("Vorname mit fgets(): ");
          fgets(vorname, 21, stdin); 
    
          return 0;
    }
    

    Auch hier sieht die Ausgabe folgendermaßen aus:

    Vorname mit scanf(): test
    Vorname mit fgets(): Drücken Sie eine beliebige Taste . . .

    Vielen Dank für eure Hilfe,
    Lg, David



  • hi
    newline nach scanf vergessen wegzuräumen?
    versuch mal deine scanf anweisung so zu schreiben

    do scanf("%lf", &matnr); while(getchar() != '\n');
    


  • fgets() liest bis zum nächsten '\n', das es im Eingabepuffer findet. scanf() liest solange, bis es ein Zeichen nicht mehr interpretieren kann (und whitespaces inklusive '\n' dienen fast immer als Endemarke) - das heißt das Zeilenende von der vorigen scanf()-Eingabe bleibt im Tastaturpuffer zurück und muß von Hand entsorgt werden ( while(getc()!='\n'); wäre dafür geeignet).



  • Hallo!

    Erstmals danke für eure Antworten..

    Hab das jetzt folgendermaßen probiert:

    printf("\nBitte Matrikel-Nr. eingeben: ");
    scanf("%lf", &matnr);
    
    printf("Bitte Namen eingeben: ");
    do scanf("%s", &name); while(getchar() != '\n');
    

    Allerdings wenn ich jetzt für name z.b. test test2 eingebe, dann nimmt er als name nur test2...

    Bitte nochmals um Hilfe,

    Lg, David



  • In dem Fall mußt du tatsächlich fgets() verwenden - oder scanf() mit der Formatkennung "%[^\n]".

    Und damit sieht der hintere Teil der Abfrage etwa so aus:

    while(getc(stdin)!='\n');//Puffer leeren
    fgets(name,MAX_NAME_SIZE,stdin);//Name einlesen
    


  • ups, das sollte eigentlich für deine 1. scanf anweisung sein...die fgets kannst du so stehen lassen.
    wenn du es noch genauer haben willst, solltest du auch bei fgets das newline entfernen.

    char *delnewline;
    ...
    fgets(name, MAX_NAME_SIZE, stdin);
    if(delnewline = strrchr(name, '\n')) *delnewline = '\0';
    ...
    

    EDIT: man bin ich lahm -..-^



  • Hey, danke Leute...

    Eine Kombination von euren beiden Tipps hat mich auf das Ergebnis gebracht:

    while(getc(stdin)!='\n');			//Puffer leeren 
    	fgets(name,MAX_NAME_SIZE,stdin);	//Name einlesen
    
    if(delnewline = strrchr(name, '\n')) *delnewline = '\0';
    

    @Jay: strrchr liest das letzte \n aus name und ersetzt es mit einer \0, oder?
    Was bedeutet die \0 eigentlich?

    Danke nochmals,
    Lg, David



  • ZEROlimited schrieb:

    @Jay: strrchr liest das letzte \n aus name und ersetzt es mit einer \0, oder?

    strrchr() sucht nur - ersetzt wird anschließend von Hand 😉

    Was bedeutet die \0 eigentlich?

    Das ist die Stringende-Marke von C. (sprich, durch diese Zuweisung wird das '\n' vom String abgeschnitten)



  • ah.. ich depp.. schon klar lol
    Man was fuer eine nooby-frage..
    ärger ich mich gleich wieder über mich selbst 😉

    Danke 😉


Anmelden zum Antworten