strlen()



  • Beim Aufruf von strlen() mit einem unsigned char * als Argument zu casten ist zum einen nicht notwendig und nutzt zum anderen nichts.
    Die vermeintliche Lösung mit dem Makro ist nicht gut, denn sie verschleiert das eigentliche Problem:

    Ob die Funktionen aus der string.h mit unsigned char-Werten funktionieren ist nicht vorhersagbar! strlen() wird wohl gehen, strcmp() vermutlich nicht.

    Der Ansatz von (D)Evil ist der richtige, nämlich eine eigene Funktion ustrlen() zu schreiben. (Allerdings ohne "ustrlen(NULL) == 0"...)



  • na gut, dann eben kein makro 😞
    aber vielleicht so:

    //#include <string.h>   //  <--- auskommentieren
    extern size_t strlen (unsigned char*);  // <--- das da hinschreiben
    
    ...
        unsigned char us[] = {1,2,3,0};
        size_t x = strlen(us);   // <--- tätä !
    ...
    

    🙂



  • @Undertaker: Und woher soll strlen() dann kommen?

    Die Funktionssignatur von (D)Evils Funktion kann ich nicht so recht deuten. Was soll denn das zweite const bedeuten?

    (D)Evil schrieb:

    [cpp]inline size_t ustrlen(const unsigned char* const string) {[/cpp]

    Aber müsste ich ustrlen() global in meinem Projekt zur Verfügung stellen würde ich diese Funktion schreiben:

    unsigned int ustrlen(const unsigned char *string) {
        return strlen((const char*)string);
    }
    


  • martin_salo schrieb:

    Und woher soll strlen() dann kommen?

    Die kommt immernoch daher wo sie vorher auch herkam. Du behauptest gegenüber dem Compiler nur, dass die Funktion einen unsigned char* bekommt, entgegen dem was der Erzeuger der Standardbibliothek sich gedacht hat.



  • Der Linker würde doch nach einem "size_t strlen (unsigned char*)" suchen aber nur ein "size_t strlen (const char*)" finden und deshalb meckern?



  • Der Linker sucht nur nach der Funktion strlen - und C-Compiler codieren idR keine Typ-Informationen in den dekorierten Funktionsnamen (weil's in C nicht notwendig ist). Wenn du das Ding unter C++ verwenden willst, kann das durchaus zu einem Problem werden (Stichwort: Überladungen).



  • Ach so. Danke 🙂

    Was sagt hier eigentlich die 2 const aus:

    inline size_t ustrlen(const unsigned char* const string)
    

    Wenn ich der Funktion "strlen(const char *str)" etwas übergeb sagt mir das const das an den übergebenen Daten nichts verändert wird. Was bewirkt das 2te const von oben zusätzlich?



  • Das sagt dir, daß die Funktion den übergebenen Zeiger nicht verändert (aber da dieser Zeiger sowieso eine Kopie des Arguments ist, ist das eigentlich bedeutungslos).





  • Ok vielen Dank 🙂


Anmelden zum Antworten