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 ]
000
31.03.2003, 10:51 Uhr
~Steve-o
Gast


wie kann ich ein string nach einem bestimmten zeichen durchsuchen! es gibt ja diesen befehl strchr(...,...)! aber wie wird der genau angewandt!
hat jemand vielleicht ein quelltextbeispiel?! und wie kann ich z.b genau nach dem ersten, dritten , ... zeichen suchen!?

MFG
Steve-o
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.03.2003, 12:21 Uhr
Tesla



Ich habe ein beispiel hoffe es hielft dir weiter
Code:

C++:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( void )
{
    char buffer[80];
    char* where;

    strcpy( buffer, "video x-rays" );

    where = strchr( buffer, 'x' );

    if( where == NULL ) {
        printf( "'x' not found\n" );
    } else {
        printf( "'x' found: %s\n", where );
    }

    return EXIT_SUCCESS;
}


Ich denke das erklärt sich selbst...
ich kann sowas leider noch nicht auswendig, deswegen muss ich das immer irgentwo klaun, tut mir leid....
MFG Tesla
--

C++:
if(rpc_reg(RUSERSPROG, RUSERSVERS,
        RUSERSPROC_NUM, rusers,
        xdr_void, xdr_u_long,
        "visible") == -1) {fprintf(stderr, "Couldn'tRegister\n");
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.03.2003, 13:05 Uhr
~dirweis
Gast


hallo steve,

mir ist zwar schleierhaft, wie teslas code funktionieren soll, aber warum machst du es dir mit unnötigen funktionen so schwer? überleg doch mal, was ein string ist. eine zeichenkette, die auch noch indiziert ist, da ein string IMMER ein array von zeichen darstellt. renn da doch einfach in einer schleife durch (die länge eines strings gibt dir strlen zurück, das terminierungszeichen wird dabei aussen vorgelassen; sie ist also absolut schwanz), und unterbrich die schleife, wenn das zeichen gefunden wurde. ich nehme in meinem beispiel mal eine Zählervariable zlr und eine string-variable str. wieterhin soll das zu suchende zeichen das kleine b sein.

for(zlr=0;zlr<strlen(str);zlr++) /*das jedes array bei 0 beginnt*/
if('b'==str[zlr]) break; /*der array-wert in zlr in der syntax string[]*/

return zlr; /*hier is nu die position deines zeichens...*/

das ist ansi c. keine ahnung, wie das ganze in c++ aussehen würde, aber wahrscheinlich ganz ähnlich.

viel spass
dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.03.2003, 14:36 Uhr
Tesla



Entschuldigung, aber ich muss jetzt doch mal beschwerde einlegen ;-) warum soll mein code nich funktionieren?
Es mag ja viele bessere möglichkeiten geben, aber ich dacht so funktioniert das auch? Aber du hast ja recht das das umständlich ist, aber ich als nafänger habe halt keine bessere lösung... :-(
Aber danke für den hinweis ich doppelcheck das nochmal.....
MFG Tesla
--

C++:
if(rpc_reg(RUSERSPROG, RUSERSVERS,
        RUSERSPROC_NUM, rusers,
        xdr_void, xdr_u_long,
        "visible") == -1) {fprintf(stderr, "Couldn'tRegister\n");
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.03.2003, 15:24 Uhr
BeS




Zitat:
~dirweis postete

for(zlr=0;zlr<strlen(str);zlr++) /*das jedes array bei 0 beginnt*/
if('b'==str[zlr]) break; /*der array-wert in zlr in der syntax string[]*/

return zlr; /*hier is nu die position deines zeichens...*/



Das ist imho aber auch kein guter Programmierstil :p

for-Schleifen verwendet man, wenn man von Anfang an weiß wie oft man einen Befehl/Block ausführen will.
Für Fälle wie hier nimmt man eine while-Schliefe:


C++:
while(ch != str[ i ] && i<strlen(str))
  i++;

if(str[ i ]==ch)
  printf("%c gefunden: %d \n", ch, i);
else
  printf("%c nicht gefunden!\n", ch);



Oder man löst es so wie Tesla, wenn es dazu schon eine Funktion gibt ist es natürlich meisten die schönere Lösung.
--
If art interprets our dreams, the computer execute them in the guise of programs!

Dieser Post wurde am 31.03.2003 um 15:27 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.03.2003, 16:13 Uhr
~0xdeadbeef
Gast


Echt jetzt? Ich nehm for-Schleifen, wenn man den Schleifenverlauf sinnvoll in Anfangsbedingung, Endbedingung und Schritte unterscheiden kann. Das Beispiel von dirweis ist schlechter Programmierstil, weil es unnötig Rechenzeit frißt, durch den Aufruf von strlen in jedem Durchlauf. Es kann zwar sein, dass ein sehr intelligenter Compiler das merkt, aber verlassen kann man sich darauf nicht. In diesem speziellen Fall wäre m.E. das sinnvollste, auszunutzen, dass strings in C null-terminiert sind (genau das tut strlen ja auch), und die Sache so zu schreiben:

C++:
char gesuchtes_zeichen = 'x';
for(int i = 0; str[i] && str[i] != gesuchtes_zeichen; ++i); //ISO-C 99! für ältere Standards vorher int i; deklarieren


Jedenfalls gesetzt den Fall, dass man das wirklich von Hand machen will. In aller Regel ist es aber die sinnvollere Alternative, sich Bibliotheksfunktionen zu bedienen, weil die im Zweifel besser optimiert sind als das, was du in 5 Minuten zusammenschustern kannst. Also, ich wär für strchr und dann die Differenz der Pointer zu nehmen. Zum Beispiel so:

C++:
int posOfCharInString(char *str, char c) { return (strchr(str, c) - str)/sizeof(char); }

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.03.2003, 16:14 Uhr
~0xdeadbeef
Gast


Seufz, ich vergess immer den ThWboard code, die Schleife sollte natürlich so aussehen:

C++:
for(int j=0; str[j] && str[j] != gesuchtes_zeichen; ++j);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.03.2003, 17:29 Uhr
BeS




Zitat:
~0xdeadbeef postete
Echt jetzt? Ich nehm for-Schleifen, wenn man den Schleifenverlauf sinnvoll in Anfangsbedingung, Endbedingung und Schritte unterscheiden kann. Das Beispiel von dirweis ist schlechter Programmierstil, weil es unnötig Rechenzeit frißt, durch den Aufruf von strlen in jedem Durchlauf. Es kann zwar sein, dass ein sehr intelligenter Compiler das merkt, aber verlassen kann man sich darauf nicht.


ok, ich habe jetzt nicht so sehr auf die Rechenzeit geachtet. Aber bei der Schleifenwahl bleibe ich dabei. Du sagst es ja selber "wenn man den Schleifenverlauf sinnvoll in Anfangsbedingung, Endbedingung und Schritte unterscheiden kann". In diesem Fall kannst du aber nicht von Anfang an das Schleifenende vorhersagen, deswegen musste ~dirweis auch die break Anweisung verwenden. Imho unschön weil ich da die for-Schleife Zweck entfremde, ich definiere erst das sie von 'a'-'c' laufen soll und mitten im Schleifenrumpf fällt mir dann ein das ich doch schon bei 'b' aussteigen will.

Das mit der Rechenzeit lässt sich ja lösen. Entweder ich bestimme am Anfang die länge:


C++:
lng=strlen(str);

while(ch != str[ i ] && i<lng)
  i++;

if(str[ i ]==ch)
  printf("%c gefunden: %d \n", ch, i);
else
  printf("%c nicht gefunden!\n", ch);



oder ich nütze das \0 aus:


C++:
while(str[ i ] != ch &&  str[ i ] != '\0')
  i++;

if(str[ i ]==ch)
  printf("%c gefunden: %d \n", ch, i);
else
  printf("%c nicht gefunden!\n", ch);


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

Dieser Post wurde am 31.03.2003 um 17:30 Uhr von BeS editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.04.2003, 11:49 Uhr
~dirweis
Gast


hallo tesla,

ging kein bisschen gegen dich. aber ist ja der hammer, was ich da eine debatte ins rollen gebracht hab. )

ach übrigens: ich bleibe bei meinem stil... (bitte NICHT krumm nehmen)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.04.2003, 12:04 Uhr
~0xdeadbeef
Gast


Zwei Dinge: Vorher die Länge abzuprüfen frißt immer noch viel zu viel Rechenzeit. Was im Grunde da steht, ist:

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


Will sagen, du läufst dem String im Grunde zweimal durch. Das hier:

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. Für genau solche Schleifen ist die for-Schleife ja da.
Wir programmieren hier schließlich kein BASIC; wenn du schon vorher weißt, wie oft die Schleife durchlaufen wird, solltest du eher über Duff's Device oder template metaprogramming nachdenken.
 
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: