*char mit scanf einlesen?



  • Hallo!

    C-Anfänger hier 😞

    Ich habe eine Funktion, die folgendermaßen aussieht: function(*char name)

    Ich will, dass der Benutzer via scanf name eingeben kann, leider bekomme ich es nicht hin.

    Habe schon einiges versucht, das einzige, wo ich beim Kompilieren keinen Fehler bekam war: scanf("%s",&*name). Leider bekomme ich dann einen Segmentation fault.

    Ich dachte mir evtl. liegts am Format, dass s nicht mit dem *char von function kompatibel ist und habe versucht name mal mit printf ausgeben zu lassen, um zu sehen, ob überhaupt richtig eingelesen wurde, aber sogar da bekomme ich schon den Segmentation fault. Was ist da falsch und wie bekomme ich es hin, dass ich name so einlesen kann, dass function es dann auch frisst?



  • Sry, die Funktion sieht natürlich so aus: function(char *name)

    Kann als unregistrierter nicht editieren...



  • scanf( "%s", name);
    

    name muß natürlich auch schon Speicherplatz habe, zB als

    char name[256];
    

    definieren.



  • insgesamt zum beispiel so:

    #include <stdio.h>
    
    int main () {
    	char input[50];
    	printf("\nEingabe: ");
    	scanf("%s", input);
    	printf("\nAusgabe: %s\n", input);
    
       return 0;
    }
    

    bei der scanf-funktion steht übrigens der adressoperator "&" nicht, weil du ein array von charactern hast, welches intern bereits ein zeiger ist, also schon eine adresse enthält.



  • just_phil schrieb:

    int main ()
    

    Entweder keine Parameter ( void ) oder die im Standard definierten ( int, char* [] ).

    just_phil schrieb:

    [...] weil du ein array von charactern hast, welches intern bereits ein zeiger ist, [...]

    Nein. Ein Array ist kein Zeiger. Es trifft jedoch zu, das array einem &array[ 0 ] entspricht, somit der Name eines Arrays der Adresse des ersten Elements entspricht.

    cheers, Swordfish

    PS: fscanf( ) ist sicherer.



  • Swordfish schrieb:

    just_phil schrieb:

    int main ()
    

    Entweder keine Parameter ( void )[...]

    frage: ich habe bis zu einem gewissen zeitpunkt parameterlose funktionen (auch main, wenn ich keine benötige) auch stets in der form function(void) markiert. und zwar so lange, bis ich bemerkte, dass es auch ohne geht und zumindest der gcc inklusive "-Wall" und "-pedantic" keine warnungen anzeigt. ist das (void) wirklich nach ansi-c obligatorisch? würde mich sehr interessieren.



  • Es gibt immer die Praxis und die "reine Lehre" 🙂



  • just_phil schrieb:

    ist das (void) wirklich nach ansi-c obligatorisch?

    ISO/IEC 9899:TC2 schrieb:

    6.9.1 Function definitions

    [...]

    5 If the declarator includes a parameter type list, the declaration of each parameter shall include an identifier, except for the special case of a parameter list consisting of a single parameter of type void, in which case there shall not be an identifier. No declaration list shall follow.

    cheers, Swordfish



  • just_phil schrieb:

    und zwar so lange, bis ich bemerkte, dass es auch ohne geht und zumindest der gcc inklusive "-Wall" und "-pedantic" keine warnungen anzeigt. ist das (void) wirklich nach ansi-c obligatorisch? würde mich sehr interessieren.

    wenn man's ganz genau nimmt, muss ein einsames 'void' in der parameterliste stehen. ich weiss auch nicht, warum viele compiler leere klammern akzeptieren. musste mal nach google, schätze ich.
    🙂



  • ~fricky schrieb:

    [...] ich weiss auch nicht, warum viele compiler leere klammern akzeptieren.

    Weil eine leere Parameterliste bedeutet, das der Funktion beliebig viele Parameter übergeben werden dürfen. Es ist ja nicht falsch - nur in den meisten Fällen nicht das, was Du willst.

    void foo( void );        // keine Parameter
    void foo( );             // variable Anzahl an Parametern
    void foo( T bar );       // genau ein Parameter vom Typ T
    void foo( T bar, ... );  // variable Anzahl an Parametern aber
                             // mindestens einer vom Typ T.
    

    cheers, Swordfish



  • Swordfish schrieb:

    ~fricky schrieb:

    [...] ich weiss auch nicht, warum viele compiler leere klammern akzeptieren.

    Weil eine leere Parameterliste bedeutet, das der Funktion beliebig viele Parameter übergeben werden dürfen.

    und was ist mit func(...) ?
    🙂


Anmelden zum Antworten