strchr funzt nit...
-
char *mystrchr(const char *s, char c) { for(unsigned int i=0; i<=strlen(s); i++) { if(s[i] == c) { return s; } } return NULL; }
hi!
bekomm bei return s; immer folgenden error: error C2440: 'return' : cannot convert from 'const char *' to 'char *'
mir is schon klar warum das kommt...aber wie lös ich das problem?cu
-
Hi,
wenn das so klar ist, dann wüsstest du, dass deine Funktionsdeklaration nicht mit dem übereinstimmt, was zurückgegen wird:
const char *mystrchr(const char *s, char c)
-
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...
cuok, 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.