sprintf in char* Funktion = datenmüll?



  • Tachyon schrieb:

    ...und damit den ganzen andren Sachen (außer vielleicht direkt codieren) vorzuziehen.

    deswegen ja das makro auf der vorherigen seite, wofür ich den pöter voll bekommen habe. eine funktion um sprintf zu stricken, die nichts weiter macht, als das, was sprintf sowieso schon kann, finde ich nämlich ziemlich albern.
    🙂



  • trivialfunction-freak schrieb:

    Tachyon schrieb:

    ...und damit den ganzen andren Sachen (außer vielleicht direkt codieren) vorzuziehen.

    deswegen ja das makro auf der vorherigen seite, wofür ich den pöter voll bekommen habe. eine funktion um sprintf zu stricken, die nichts weiter macht, als das, was sprintf sowieso schon kann, finde ich nämlich ziemlich albern.
    🙂

    Makros sind für sowas erst recht scheisse.
    Den Krams sollte mal grundsätzlich vermeiden, weil das NICHT vom Compiler behandelt wird, sondern vom Präprozessor und man damit die ohnehin schon dürftigen Compilezeitchecks in C noch mehr aushebeln. Von den "Mysterien" die bei Operationen mit Nebeneffekten im Zusammenhang mit Makros entstehen mal ganz abgesehen. Dann doch lieber eine Funktion.



  • Tachyon schrieb:

    Den Krams sollte mal grundsätzlich vermeiden, weil das NICHT vom Compiler behandelt wird, sondern vom Präprozessor und man damit die ohnehin schon dürftigen Compilezeitchecks in C noch mehr aushebeln.

    das ist kein ausreichender grund, denn das, was der preprocessor erzeugt, geht anschliessend ja doch durch den compiler.

    Tachyon schrieb:

    Von den "Myterien" die bei Operationen mit Nebeneffekten im Zusammenhang mit Makros entstehen mal ganz abgesehen.

    wenn man sich damit auskennt, sind die risiken beim einsatz von makros leicht überschaubar. deine argumentation erinnert mich doch sehr an die leute, die immer sagen: 'gotos und rekursionen sind grundsätzlich schlecht'.
    🙂



  • ok, tun wir so, als hätte ich das verstanden, wäre dann die richtige Lösung, etwas derartiges:

    int test (float f, char * p)
    {
       sprintf(p, "%f", f);
       return 1;
    }
    int main (void)
    {
       char sz[100];
       float fl = 4711.00;
    
       test(fl, sz);
       printf("float: %f, str: %s\n", f, sz);
       return 1;
    }
    


  • ehemaliger-call-by-value- schrieb:

    int test (float f, char * p)
    {
       sprintf(p, "%f", f);
       return 1;
    }
    

    Wozu der Rückgabewert ?



  • man könnte wohl damit das sprintf in eine if-bedingung packen(sprintf(...),1 <- wäre ja viel schwerer).



  • wurst schrieb:

    man könnte wohl damit das sprintf in eine if-bedingung packen(sprintf(...),1 <- wäre ja viel schwerer).

    Könnte man, und dann ??

    if ( sprintf(p, "%f", f) == ... )
    // dann.. ????
    


  • Kartoffelnesser schrieb:

    wurst schrieb:

    man könnte wohl damit das sprintf in eine if-bedingung packen(sprintf(...),1 <- wäre ja viel schwerer).

    Könnte man, und dann ??

    if ( sprintf(p, "%f", f) == ... )
    // dann.. ????
    
    if ( sprintf(p, "%f", f) < 0 )
       return 0; /* sprintf fehlgeschlagen */
    

    😉

    manchaml finde ich sowas wichtig, auch wenn es nicht immer notwendig einen Rückgabewert zu liefern. Bei einer Bibliothek würde ich sowas auf jeden Fall aufbauen. Wobei ich die Fkt so geschrieben hätte:

    int test (float f, char * p)
    {
       int ret;
       if(p == NULL)
          return 0;
       ret = sprintf(p, "%f", f);
    
       if(ret < 0)
         return 0;
    
       return 1;
    }
    


  • supertux schrieb:

    int test (float f, char * p)
    {
       int ret;
       if(p == NULL)
          return 0;
       ret = sprintf(p, "%f", f);
    
       if(ret < 0)
         return 0;
    
       return 1;
    }
    

    returniere doch besser 'ret' wenn's geklappt hat. manchmal ist es ganz nützlich, zu wissen, wie viele zeichen sprintf ausgespuckt hat.
    🙂



  • 'ret' zu returnieren (*lol*) wäre auch eine gute Idee.



  • supertux schrieb:

    if ( sprintf(p, "%f", f) < 0 )
       return 0; /* sprintf fehlgeschlagen */
    

    😉

    Kannst du mir bitte ein Beispiel nennen, in dem sprintf einen Wert kleiner Null liefert ?



  • Kartoffelnesser schrieb:

    supertux schrieb:

    if ( sprintf(p, "%f", f) < 0 )
       return 0; /* sprintf fehlgeschlagen */
    

    😉

    Kannst du mir bitte ein Beispiel nennen, in dem sprintf einen Wert kleiner Null liefert ?

    man sprintf schrieb:

    If an output error is encountered, a negative value is returned.

    hab mich nur an die Doku gehalten. Aber stimmt, bei sprintf wird das wahrscheinlich nie der Fall sein. Daran habe ich nicht gedacht.



  • man sprintf schrieb:

    If an output error is encountered, a negative value is returned.

    Komisch, das steht in meiner Doku nicht drin.



  • Hallo.

    Wenn ich bei mir folgendes schreibe:

    void inttostr(char *buffer, int Zahl) 	// Datenbereich für die Zahl , Übergebener Zahlenwert
    {
    	sprintf(buffer, "%i", Zahl);		
    }
    

    steht nach Ausfürhung der Funktion in der Variable, die ich an buffer übergebe
    nie die erste Zahl aus der Variable Zahl drin?!?

    Beispiel:
    Ich will 2312 in ein String schreiben. Im String steht nachher aber " 312".
    Mit dem Leerzeichen vorne!!!!

    Warum? Jemand ne Idee?

    Gruß


Anmelden zum Antworten