Forum: Knobelecke
Moderatoren: broesel, juergenThema: strlen()
jeder kennt die traditionelle strlen()-Implementation:
size_t strlen(const char *str)
{
size_t i;
for (i=0; str[i]; i++);
return i;
}
Diese Version lässt sich geringfügig optimieren, indem man mit einem Pointer statt einem Index über das Array iteriert. Dies beeinträchtigt allerdings wesentlich die Lesbarkeit, deshalb sieht man oft die oben angegebene Version.
Das Rätsel:
Wie lässt sich strlen() erheblich optimieren?
Wenn genug Leute mitmachen, können wir vielleicht eine Art Wettbewerb veranstalten. Wer die schnellste strlen()-Implementation schreibt, ist Sieger und erhält... Ruhm.
Ein paar Regeln/Hinweise:
- kein Assembler! Nur reines C.
- der Prototyp bleibt unverändert.
- keine Taschenspielertricks. Es werden nicht heimlich irgendwo Stringlängen gespeichert
- Portabilität spielt keine Rolle. Alles, was auf meinem i686 korrekte Ergebnisse liefert, ist ein gültiger Beitrag.
- die Regeln werden während des Wettbewerbs evtl. ergänzt
- es gibt keine Regel Nr. 6
Viel Spaß!
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
Re: strlen()
Patrick am 13.07.2010 um 16:43
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char foo[] = "Hallo Welt.";
printf("%s ist %d Zeichen lang\n", foo, strcspn(foo, "\0"));
return EXIT_SUCCESS;
}
--
To follow the path: look to the master, follow the master, walk with the master, see through the master, become the master.
Re: strlen()
broesel (webmaster) am 13.07.2010 um 18:36
Ich dachte da eher an sowas wie (Tipp) loop-unrolling etc.
Gruss,
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
Re: strlen()
ITEDVO am 14.07.2010 um 00:29
#include <conio.h>
#include <stdio.h>
int mystrlen(char str[])
{
int len=wherex();
printf("%s", str);
len=wherex() - len + 1;
return len;
}
void main()
{
char str[MAX];
printf("Stringlänge: %d", mystrlen(str));
}
erklärung:
für die, die wherex() nicht kennen: es gibt die x koordinate des cursors an
zu erst wird die start position festgelegt (falls x nicht 1)
dann wird ausgegeben und cursor steht beim letzten buchstaben... dann wird wieder position ermittelt... diese dann minus der 1. position + 1 (+1 weil: x bei 1 und nicht bei 0 beginnt)
hoffe das gilt als lösung =b
--
Was nicht ist, kann noch werden =b
rock by vote or play by vote
<a href="http://www.selfmades.eu" target="blank"><img src="http://selfmades.eu/Clanwerbung/LinkUs/ITEDVO.jpg" alt="Clan Selfmades" title="Clan Selfmades"></a>
Re: strlen()
broesel (webmaster) am 14.07.2010 um 00:54
Zitat:
hoffe das gilt als lösung =b
Nope.
Zum einen liefert die Funktion nicht immer das richtige Ergebnis, z.B. wenn der Cursor beim Aufruf nicht bereits in der ersten Spalte ist, oder das aufrufende Programm gar kein Terminal zur Verfügung hat. Zum anderen ist es kein reines C (wer oder was ist wherex()?). Und zum dritten ist das keine gültige Implementierung von strlen(), denn strlen() macht keine Ausgabe.
Vielleicht ist es besser, wenn wir das Regelwerk mal ergänzen:
- mögliche Lösungen rufen keine weiteren Funktionen auf
- mögliche Lösungen verhalten sich aus Sicht des Aufrufers exakt so wie das Standard-strlen()
Gruss,
Philip
--
The C Programming Quiz
- bitte Fragen einreichen :)
