sscanf geht unter Windows aber nicht unter Linux



  • Hallo!
    Habe mich mal an C gewagt und prompt schlägt schon bei den einfachsten programmen der Fehlerteufel zu.
    Ich hab ein kleines Miniprogramm geschrieben, dass den Namen des Benutzers einliest und dann den Namen und die Länge des Namens ausgibt. Unter Windows XP rennts einwandfrei, unter Linux (Debian Etch) jedoch nicht, es kommt immer "Speicherzugriffsfehler" 😞
    Kann mir wer helfen? Ich konnte nicht wirklich was über die Sufu noch Google finden.
    Hier ist der Code:

    #include<stdio.h>
    #include<string.h>
    
    int main()
    {
            char buffer[80];        /* input buffer */
            char *in;               /* input */
    
            printf("Please enter your name: ");
            fgets(buffer, 80, stdin);
            sscanf(buffer, "%[^\n]", in);
            printf("\nYour name (%s) ist %d chars long!\n", in, strlen(in));
    
            return 0;
    }
    

    LG



  • Das es unter Windows läuft, ist purer Zufall.

    Du hast für die Variable "in" überhaupt keinen Speicher reserviert.
    Und warum rufst du erst fgets aus und dann sscanf. Nimm doch gleich scanf:

    char buffer[80];
    printf("Please enter your name: ");
    scanf("%80s", buffer);
    printf("\nYour name (%s) ist %d chars long!\n", buffer, strlen(buffer));
    


  • Th schrieb:

    Das es unter Windows läuft, ist purer Zufall.

    Du hast für die Variable "in" überhaupt keinen Speicher reserviert.

    OMG!
    Keine Ahnung warum ich da nicht selber draufgekommen bin o.0
    Danke!

    Th schrieb:

    Und warum rufst du erst fgets aus und dann sscanf. Nimm doch gleich scanf:

    Hmm... Ich habe deshalb fgets und dann sscanf genommen, weil hier ( http://www.galileo-press.de/openbook/c_von_a_bis_z/c_005_001.htm ) steht, dass wenn man nur scanf verwendet bei Linux die Eingabe übersprungen werden kann (oder so), siehe ganz unten auf der Seite.

    Habs nun so, jetzt funkts bei Linux und Win.

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    int main()
    {
    	char buffer[80];	/* input buffer */
    	char *in;		/* input */
    
    	printf("Please enter your name: ");
    	fgets(buffer, 80, stdin);
    	in = (char *) malloc(strlen(buffer)*sizeof(char));
    	sscanf(buffer, "%[^\n]", in);
    	printf("\nYour name (%s) ist %d chars long!\n", in, strlen(in));
    
    	return 0;
    }
    

    PS: Ich verwende absichtlich in und nicht gleich buffer.



  • Th schrieb:

    Das es unter Windows läuft, ist purer Zufall.

    Du hast für die Variable "in" überhaupt keinen Speicher reserviert.
    Und warum rufst du erst fgets aus und dann sscanf. Nimm doch gleich scanf:

    ich finde, es ist immer besser fgets zu benutzen und dann die Eingabe mit strtok oder sscanf oder was auch immer zu parsen, denn damit muss man sich nicht mit dem stdin-Puffer-Leeren Geschichte beschäftigen, vor allem, wenn man strings über scanf liest.

    @ameise: Dein sscanf kannst du dir ersparen 🙂

    buffer[strlen(buffer) - 1] = 0;
    

    löscht auch das \n Zeichen.


Anmelden zum Antworten