Funktion strcat selbst schreiben
-
@Swordfish siehs mir halt nach
-
@bruecksy Peinlich für MICH weil ich nicht gerafft habe welche Stelle Du meintest. Mehr Selbstvertrauen Brudi.
@Swordfish sagte in Funktion strcat selbst schreiben:
while (dst[dst_index++] = src[src_index++]);
Du kannst das natürlich auch langatmiger schreiben:
while (dst[dst_index] = src[src_index]) { ++dst_index; ++src_index; }
Die Zuweisung ist im Schleifenkopf damit auch die
'\0'
mitkopiert wird.Wenn die Aufgabe war
strcat()
zu schreiben war doch sicher die vorhergehende Aufgabestrcpy()
zu schreiben? Wie sieht denn das bei Dir aus?
-
@Swordfish ne die vorherige war strcmp()... die sieht bei mir so aus:
int string_compare(char v[], char w[]) { int a; int i = 0; while (i < v[i]) { if(v[i] < w[i]) { a = -1; } else if (v[i] > w[i]) { a = 1; } else { a = 0; } ++i; } return a; }
-
Dann mach mal
strcpy()
. Ist ja kein Aufwand.
-
@bruecksy sagte in Funktion strcat selbst schreiben:
while (i < v[i])
Kannst Du mir das bitte erklären?
-
@Swordfish
der ganze Codeint string_compare(char v[], char w[]); int main(void) { char v[5] = "test"; char w[5] = "test"; printf("%i", string_compare(v, w)); return 0; } int string_compare(char v[], char w[]) { int a; int i = 0; while (i < v[i]) { if(v[i] < w[i]) { a = -1; } else if (v[i] > w[i]) { a = 1; } else { a = 0; } ++i; } return a; }
-
Ja ne, erklär' mir bitte Deinen Gedankengang bei
@bruecksy sagte in Funktion strcat selbst schreiben:while (i < v[i])
Mein
strcmp()
:int strcmp(char const *lhs, char const *rhs) { while ((*lhs && *rhs) && (*lhs == *rhs)) // 1) ++lhs, ++rhs; return (char unsigned)*lhs - (char unsigned)*rhs; }
1) läuft solange beide Dingstis noch nicht am Ende sind (
*lhs && *rhs
... kurz für*lhs != '\0' && *rhs != '\0'
) und die Zeichen gleich sind (*lhs == *rhs
).
Danach braucht man bloß noch subtrahieren.
-
@Swordfish
Da v und w gleich viele Komponenten besitzen, ist in v[5] und w[5] die binäre Null gespeichert. Die ersten vier Komponenten werden bezüglich der lexikographischen Ordnung miteinander verglichen. In diesem Beispiel wird 0 ausgegeben, da sich die Komponenten nicht voneinander unterscheiden
-
@bruecksy Was hat denn der Index mit dem Zeichen zu tun? Du vergleichst
i < v[i]
...@bruecksy sagte in Funktion strcat selbst schreiben:
Da v und w gleich viele Komponenten besitzen
Das hat deine Funktion nicht zu interessieren. Die muss für ALLE MÖGLICHEN Eingaben passen.
Nur zur Erinnerung:
Compares two null-terminated byte strings lexicographically.
The sign of the result is the sign of the difference between the values of the first pair of characters (both interpreted as
unsigned char
) that differ in the strings being compared.The behavior is undefined if lhs or rhs are not pointers to null-terminated byte strings.
Also: Stelle finden an der sich die beiden Strings unterscheiden oder zuende sind und dann subtrahieren. Fertig.
-
@bruecksy sagte in Funktion strcat selbst schreiben:
in v[5] und w[5] die binäre Null gespeichert. Die ersten vier Komponenten
Das fällt mir erst jetzt auf.
v[5]
(bzw.w[5]
) ist das 6te Arrayelement. Davor sind fünf andere. Arrays beginnen bei0
.
-
@Swordfish klar, das ist richtig, dankeschön.