strchr funzt nit...



  • 1. Die Warnung kommt, weil s ein const char* ist und mystrchr ein char* zurückliefert. Es gibt kein Problem, diese Warnung kannst du auch vergessen.

    2. Benutze i<=strlen(s) nicht, denn jedes Mal, wenn diese Bedingung überprüft wird, wird strlen ausgeführt und das läuft in O(n), also läuft dein Ding in unnötigen O(n²) Schritten. Mach

    char *mystrchr(const char *s, char c)
    {
        size_t i, len=strlen(s);
        for(i=0; i<len; i++)
        {
    

    ich würde auch nicht i<=len benutzen, denn dann vergleichst du auch \0 und das ist nicht nötig.



  • 1. Die Warnung kommt, weil s ein const char* ist und mystrchr ein char* zurückliefert. Es gibt kein Problem, diese Warnung kannst du auch vergessen.

    Das ist leider kein guter Hinweis. Wenn eine Warnung kommt, sollte man das schon berücksichtigen, sonst kann es hinterher zu ernsthaften Problem führen.



  • das ist keine warnung sondern ein error!!

    die funktionsdeklaration von strchr aus der string lib. schaut aber auch so aus:
    char *strchr(const char *s, char c)

    hm...
    cu



  • CarstenJ schrieb:

    1. Die Warnung kommt, weil s ein const char* ist und mystrchr ein char* zurückliefert. Es gibt kein Problem, diese Warnung kannst du auch vergessen.

    Das ist leider kein guter Hinweis. Wenn eine Warnung kommt, sollte man das schon berücksichtigen, sonst kann es hinterher zu ernsthaften Problem führen.

    das habe ich nicht so gemeint, ich meinte nur diese Warnung auf dieses Problem braucht er nicht zu brücksichtigen, weil er den Inhalt von s nicht verändert und deshalb es kein Problem gibt. ich bin auch so ein Feak, der erst zufrieden ist, wenn nicht mal ein Warnung kommt.

    coder1 schrieb:

    das ist keine warnung sondern ein error!!

    die funktionsdeklaration von strchr aus der string lib. schaut aber auch so aus:
    char *strchr(const char *s, char c)

    hm...
    cu

    ok, da ist der gcc ein bisschen flexibler, weil gcc da nur eine Warnung rausbringt.

    Dann musst du den Code ändern, entweder das const weg machen oder CarstenJs Post übernehemen.



  • in der c-string lib schaut der allgo so aus:

    ;       Algorithm:
    ;       char *
    ;       strchr (string, chr)
    ;       char *string, chr;
    ;       {
    ;         while (*string && *string != chr)
    ;             string++;
    ;         if (*string == chr)
    ;             return(string);
    ;         return((char *)0);
    ;       }
    

    warum is hier: *string && *string ??
    cu



  • coder1 schrieb:

    warum is hier: *string && *string ??

    hier stand mist. zu schnell geantwortet 😞



  • while (*string && *string != chr)
    

    sollst du so lesen

    while (*string && (*string != chr))
    

    dabei will man den \0 nicht untersuchen, wozu denn auch? Hab oben dir auch gesagt.



  • statt

    return s; /* gibt immer den Anfang des Strings zurueck */
    

    muss es

    return (char*) ( &s[i] ); /* gibt die Adresse des i-ten Elements als char* zurueck. */
    

    heissen.



  • Power Off schrieb:

    statt

    return s; /* gibt immer den Anfang des Strings zurueck */
    

    muss es

    return (char*) ( &s[i] ); /* gibt die Adresse des i-ten Elements als char* zurueck. */
    

    heissen.

    warum nicht, wenn s schon ein char* ist:

    return s+i;
    


  • net schrieb:

    warum nicht, wenn s schon ein char* ist:

    return s+i;
    

    Weil "s" im Anfangspost als "const char*" definiert ist.


Anmelden zum Antworten