Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » brauche Hilfe bei eigener Stringfunktion

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
17.11.2003, 13:16 Uhr
HRI-Dummy



Hallo!

Ich bin dabei mir eine Funktion zu schreiben, die die Anzahl der Kommas in einem Substring sucht. Das Grundgeruest kriege ich ja noch hin, bloss danach habe ich ein Problem.
Bis jetzt sieht das ganze folgendermassen aus:


Code:
int nrsigns(char *str)
{
    char sign[2] = ",";
    char help[256];
    unsigned int number = 0;
    int end = *(strstr(str,"from"));

    memcpy(help,str,end);

    if ((strchr(help,sign)) !=  NULL)
    {
        number++;
    }

    //hier sollte es dann weitergehen...

    return (number + 1);
}



So wie es jetzt ist, kriege ich nur das erste Komma raus, beziehungsweise, ob ueberhaupt eins drin ist.
Ich wollte eigentlich so weitermachen, dass ich jetzt ab dem ersten Komma (falls vorhanden) anfange nach weiteren Kommas zu suchen. Leider brauche ich dafuer eine Stringfunktion, der ich eine Startposition uebergeben kann. Dummerweise scheint es sowas nicht zu geben (ich lasse mich natuerlich gerne eines besseren belehren! ), ich weiss aber auch nicht, wie ich sonst weitermachen soll.
Faellt dazu vielleicht irgendjemand von Euch was dazu ein?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.11.2003, 13:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


schreib dir einfach ne funktion die dir die anzahl von kommas aus nem string sucht.
wenn du nur die anzahl aus nem substring willst dann übergib dieser funktion einfach den substring


C++:
int nrsigns(char *str){
int rv=0;
for(int i=0;i<strlen(str);++i) if(str[i]==',')++rv;
retrun rv;
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.11.2003, 13:55 Uhr
0xdeadbeef
Gott
(Operator)


Wenn du's wirklich so machen willst, kannst du strtok benutzen. Oder strtok_r, wenn das Ding threadsafe sein soll. Allerdings wäre es in diesem Fall wohl sinnvoller, einfach nen Pointer über den String laufen zu lassen und entsprechend mitzuzählen:

C++:
int nrsigns(char *str) {
  char *p;
  int ret = 0;
  for(p = str; *p; ++p)
    ret += (*p == ',');
  return ret;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.11.2003, 13:56 Uhr
0xdeadbeef
Gott
(Operator)


@Windalf: strlen in der Abbruchbedingung zu benutzen halte ich für keine gute Idee. Das dürfte sich ziemlich schlecht auf das Laufzeitverhalten auswirken...
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.11.2003, 13:58 Uhr
~sabst
Gast


Hey,
wenn du statt eines if's eine while -Schleife nimmst, hast du im Prinzip schon alles was du brauchst.
(das memcpy brauchst du nicht)


C++:
int nrsigns(char *str)
{
    char sign = ',';
    char *help;
    char *next;
    unsigned int number = 0;
    help=str;

    while((next=strchr(help,sign)) !=  NULL)
    {
        number++;
        help=next+1; /*next zeigt direkt auf's komma, darum eins weiter vor,  sonst endlos*/
    }/*endwhile*/

    //hier sollte es dann weitergehen...

    return (number);
}




wenn du eine rekursive Funktion draus machen willst, machst dus halt ohne while und übergibst beim nächsten Aufruf next+1;

Dieser Post wurde am 17.11.2003 um 14:21 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.11.2003, 14:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@beefy
Perfomance war hier zwar nicht gefragt aber dein variante gefällt mir zugegebener Weise *mit den zähnen knirsch* sehr gut
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 17.11.2003 um 14:26 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.11.2003, 14:25 Uhr
HRI-Dummy



Natuerlich, einfach mal wieder zu kompliziert gedacht. Ich denke ich werde wohl die einfachste Version machen, einfach den String mit einer for-Schleife durchlaufen und die einzelnen Zeichen vergleichen.
Danke fuer die Hilfe, manchmal hab ich das totale Brett vorm Kopf, da waere ich ohne dieses Forum ziemlich aufgeschmissen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.11.2003, 14:26 Uhr
Pablo
Supertux
(Operator)


Ich glaube, dass jeder Programmier Performance will und seine Programme so schnell wie möglich gestalten, deshalb würde ich strlen nicht in der bedingen nehmen, denn das könnte unter Umständen sehr viel Zeit kosten, wenn die Schleife ewig lang rechnet.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
17.11.2003, 14:31 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@Pablo
also ich glaube nicht das mein kompiler das so übersetzt das strlen bei jedem schleifendurchlauf einmal aufgerufen wird.
In sofern ist mein Spass genau einmal strlen aufrufen langsamer als beefys
wobei ich nicht weiss was der zeitliche unterschied zwischen diesem * und diesem [] ist.
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 17.11.2003 um 14:32 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
17.11.2003, 14:39 Uhr
0xdeadbeef
Gott
(Operator)


Dein Compiler darf das garnicht rausoptimieren. Er kann sich nicht darauf verlassen, dass er die Bibliothek, gegen die du nachher linkst, kennt - also kann er auch nicht wissen, was strlen genau macht.
Ansonsten hat der Pointer den Vorteil, dass er nachher einfach nur noch dereferenziert werden muss, während bei der []-Notation der Index auf den String-Pointer addiert wird und das Ergebnis dereferenziert wird - also ein Rechenschritt mehr.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
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: