Wörter auslesen
-
du meinst
if(*b==0) return 0;
? :p
stimmt, die nullbytes habe ich von der suche ausgeschlossen, denn ein nullbyte
soll ja nur das ende des strings markieren und nicht ein teil des strings sein.
soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?
-
achne, das war käse, es soll ja ein zeiger zurückgegeben werden, also so in der art:
return a+strlen(a);
-
B.B. schrieb:
du meinst
if(*b==0) return 0;
? :p
Nein ich meine
if(*b==0) return a;
Du gibts den Zeiger zurück, nicht den Offset.
Der Leerstring ist schon am Anfang enthalten.
-
wenn b leer ist und a nicht, dann gebe ich a zurück?
-
char *my_strstr(const char *s1, const char *s2) { const char *t = s2, *p = 0; if (!*s2) return (char*)s1; while (*s1) { if (*s1 == *t) { if (!p) p = s1; if (!*(++t)) return (char*)p; } else { t = s2; p = 0; } ++s1; } return 0; }
B.B. schrieb:
soso, dem standard nach ist es falsch, nagut, wo kann man den runterladen?
Gar nicht. Ein Draft gibt's hier:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
-
cooky451 schrieb:
Ein Draft gibt's hier:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdfah, supi, danke.
-
DirkB schrieb:
B.B. schrieb:
du meinst
if(*b==0) return 0;
? :p
Nein ich meine
if(*b==0) return a;
Du gibts den Zeiger zurück, nicht den Offset.
Der Leerstring ist schon am Anfang enthalten.Achsoo, es steht so im Standard
If s2 points to a string with zero length, the function returns s1.
sag das doch gleich
-
B.B. schrieb:
If s2 points to a string with zero length, the function returns s1.
sag das doch gleich
Nur für dich:
Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
Frei mit Babelfish
-
Sollte wohl auch einfacher gehen:
const char *my_strstr(const char *s1, const char *s2) { while (*s1) { const char *a=s1++,*b=s2; while( *a && *b && *a==*b ) ++a,++b; if( !*b ) return s1-1; } return 0; }
-
DirkB schrieb:
Wenn b auf einen String mit der Länge Null zeigt, gibt die Funktion a zurück.
Frei mit Babelfishim tschtandacht steht aber s1
okok warn scherz, ich habs jetzt gerafft auch wenns iwie unlogisch ist. :p
-
B.B. schrieb:
... auch wenns iwie unlogisch ist. :p
Im Gegenteil, es ist logisch.
-
@Wutz
Eigentlich nett, aberdu bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger istund meine Version müsste eigentlich schneller sein, da du Bereiche doppelt prüfst :p
(Ok, wirklich messen kann man den Unterschied vermutlich nicht.)Edit:
Verdammt, der Standard macht mich fertig.
-
Wutz schrieb:
Sollte wohl auch einfacher gehen:
const char *my_strstr(const char *s1, const char *s2) { while (*s1) { const char *a=s1++,*b=s2; while( *a && *b && *a==*b ) ++a,++b; if( !*b ) return s1-1; } return 0; }
was daran einfacher ist kann ich nicht erkennen. du packst quasi meine erste if-abfrage in deine while-schleife rein.
nagut, eine if-abfrage hast du dann immerhin insgesamt weniger drin :D.
aber deutlich kürzer ist deine version jedenfalls und den trick *a=s1++ find ich auch gut, hut ab, hätte von mir sein können.
:p
-
cooky451 schrieb:
... aber du bekommst nen Zugriffsfehler wenn s2 ein Nullzeiger ist ...
Na und!
Das passiert bei den Standardfunktionen auch.
Du als Programmierer hast dafür zu sorgen, dass die Funktion keinen NULL-Zeiger bekommt.
-
DirkB schrieb:
Das passiert bei den Standardfunktionen auch.
Argh da habe ich etwas verwechselt, werde mich alsbald beschämt in meine Höhle verkriechen
-
Die meisten Standardfunktionen beachten den NULL-Zeiger nicht.
strlen()
versucht auch immer brav die Länge der Zeichenkette zu ermitteln, auf die der übergebene Zeiger zeigt.
Wenn der auf NULL zeigt und das Programm hat keine Zugriffsrechte auf die Adresse NULL, so ist dasstrlen()
egal. Dann hat der Programmierer einen Fehler gemacht, nichtstrlen()
.