Anzahl an Zeichen innerhalb eines Strings auslesen



  • Also der Titel sagt eh schon einiges aus. Ich möchte wissen, wie oft ein Zeichen (in meinem Fall: '<') in einem String vorkommt.

    Gibt es dazu standard-funktionen???

    Hier der Code-Teil, den ich geschrieben habe:

    unsigned long *path_reg, *tmp_sect, count;
    
    // path_reg speichert Anfgangs-Adresse des Strings
    // tmp_sect speichert Adresse des ersten Bytes nach gefundenem Zeichen (siehe while)
    // count == Zählervariable, wie oft Zeichen vorkommt
    
    while(path_reg != 0) 
    {
       path_reg = (unsigned long *)strchr((char *)tmp_sect,'<');
       if(path_reg != 0) {
          count++;
          tmp_sect = (unsigned long *)((char *)path_reg+1);
       }
    }
    

    So, jetzt wollt ich wissen, ob es:

    1. Eine Standard-Funktion gibt die das macht (wie schon oben gefragt), und wenn Nein
    2. Ob dieser Code-Ausschnitt effizient ist, oder ob man ihn noch verbessern könnte (bin ja kein Profi und nehme deshalb an, dass man da noch was machen kann 😉 )

    Da es sicher hilfreiche Kommentare geben wird, sag ichs jetzt schon: DANKE!
    Wenn nicht verwend ich das so wie es da steht 🙂



  • Wieso benutzt du unsigned long Pointer statt char Pointern?

    Naja, ich würds jedenfalls so lösen:

    char *path_reg;
    ...
    char *cp;
    int count;
    
    for (cp = path_reg, count = 0; *cp; ++cp)
      if (*cp == '<')
        ++count;
    

    Im Endeffekt macht strchr ja auch nichts anderes als diese Schleife. Wenn es unbedingt auf höchste Geschwindigkeit ankommt, dein Compiler strchr inline expandiert AND ansonsten nicht so toll optimiert, kann deine Variante schneller sein (weil dann nämlich strchr schneller als dieselbe von Hand geschrieben läuft). Allerdings gibts dann immer noch die falschen Datentypen, also auf ein neues:

    char *path_reg;
    ...
    char *cp = path_reg;
    int count = 0;
    for(;;) {
      cp = strchr(cp, '<');
      if (!cp)    /* nicht gefunden */
        break;
      count++;
    }
    

    aber wie schon gesagt, normalerweise die erste Fassung nehmen, im Zweifelsfall messen und nur wenn es sich wirklich lohnt, auf die zweite Fassung zurückgreifen.



  • hey, danke.....

    also unsigned long pointer verwende ich, weil deren haupt-aufgabe ja nicht das aufspüren von diesem zeichen ist, sondern das arbeiten mit speicher-adressen.

    Was mich aber nicht daran hindern sollte, diese zu char* zu casten und zu verwenden?!



  • Wieso sollen unsigned long Pointer nochmal besser geeignet sein als char Pointer? Ich hab das Argument nicht ganz verstanden ... Ich geh davon aus dass du weißt, dass alle Pointer letztlich Speicheradressen darstellen ...


Anmelden zum Antworten