Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » String nach einem Zeichen durchsuchen!?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 <
010
01.04.2003, 12:05 Uhr
~0xdeadbeef
Gast


Korrigiere mich - für Duff's Device brauchst du nur ne Bedingung der Form "i < j" mit integern, musst aber den Wert von j nicht zur Compilezeit kennen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
01.04.2003, 13:15 Uhr
virtual
Sexiest Bit alive
(Operator)


Generell sind vordefinierte Routinen wie strchr eigenen Implementierungen vorzuziehen. Neben der bisher geäußerten Punkten bzgl. schlechten Programmierstil gibt es noch einen weiteren: "Es ist schlechter Programmierstil, das Rad jedesmal neu erfinden zu wollen". Eine Aussage, die ich voll unterschreiben würde und zutrifft, wenn man strchr vermeidet.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 01.04.2003 um 13:15 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
01.04.2003, 15:07 Uhr
BeS




Zitat:
~0xdeadbeef postete
Zwei Dinge: Vorher die Länge abzuprüfen frißt immer noch viel zu viel Rechenzeit.



Naja, "viel zu viel" halte ich für etwas übertrieben, so viel Rechenzeit braucht srlen auch wieder nicht.


Zitat:


C++:
for(int i = 0; str[ i ] != ch && str[ i ]; ++i);


ist ungefähr doppelt so schnell. Zum zweiten läßt sich gerade in diesem Fall die Schleife wunderbar in Anfangszustand, Endzustand und Abbruchbedingung unterteilen.



ja, diese Lösung finde ich auch in Ordnung, ist ja im Prinzip eine while-Schleife als for-Schleife verkleidet
Meine ursprüngliche Antwort hat sich ja auf die Lösung von ~dirweis bezogen welcher die for-schleife durch den ganzen string laufen lies und dann mit brake vorzeitig ausgestiegen ist.

Vielleicht liegt es auch daran, dass ich nicht in C angefangen habe zu programmieren. In den meisten Programmiersprachen sieht imho aber eine for-Schleife so aus (pseudo-code):
for i in x..y do
...
od;

das ist für mich halt das klasische Einsatzgebiet für for-schleifen.
Sobald das Schema nicht passt, sprich ich bei jedem Schleifendurchlauf auf den Abbruch stossen kann (also den Abbruch nicht wirklich vorhersagen kann) ist imho die while-Schleife das geeignete Mittel.

Durch die "erweiterte for-Schleife" in C, welche ja schon fast wie eine while-Schleife ist, gehen unter C natürlich auch solche Lösungen wie deine und sehen sicher aus kompakter aus.

Prinzipiell bin ich aber virtuals Meinung:

Zitat:

"Es ist schlechter Programmierstil, das Rad jedesmal neu erfinden zu wollen". Eine Aussage, die ich voll unterschreiben würde und zutrifft, wenn man strchr vermeidet.

--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 01.04.2003 um 15:09 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
01.04.2003, 16:14 Uhr
~0xdeadbeef
Gast


Eine for-Schleife in C ist nur eine andere Schreibweise für eine while-Schleife. Ansonsten gebe ich virtual recht.

Eine Sache noch - ich bevorzuge for-Schleifen, weil zumindest ich bei while-Schleifen immer in die Versuchung gerate, sowas zu machen:

C++:
while(str[j] != ch && str[j++]);


was mit for-Schleifen kompakt _und_ übersichtlich geht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
01.04.2003, 19:28 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Abgesehen davon, daß ich virtual voll zustimme (wenn Funktion schon da, dann nicht nochmal machen), hier noch ein kleiner Vorschlag zur Optimierung:


C++:
char* szBuffer;
for(szBuffer = str; *szBuffer; szBuffer++) if(*szBuffer == ch) break;



Das dauernde Indexieren mit der int-Variable kostet den Prozessor ordentlich Takte, weil jedesmal die Adresse des nächsten Elements im Array berechnet werden muß. Bei 32bit-Ints wäre das ein 2Bit-Shift nach links, auch das kostet Zeit. Dann lieber (wie es die meisten Compiler heute sowieso machen, aber sicher ist sicher) einen Zeiger, und den inkrementieren.
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 01.04.2003 um 19:28 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
01.04.2003, 19:50 Uhr
~0xdeadbeef
Gast


Na gut, aber dann auch auf den Stil achten:
[cpp]
for(char *pcBuffer; *pcBuffer != ch && *pcBuffer; ++pcBuffer);
[cpp]
An dieser Stelle angemerkt: pcBuffer ist in der Sache kein String, deswegen in der ungarischen
Notation auch nicht szBuffer, sondern pcBuffer (pointer auf einen char). Diese Implementierung hat noch zwei Vorteile, zum einen spart man dadurch, dass *pcBuffer zuerst mit ch verglichen wird einen Vergleich, wenn ch im String vorkommt, zum anderen spart man eine Sprunganweisung. Beides nicht wirklich gravierend, aber immerhin.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: