Anzahl der Zeichen eines Strings ermitteln



  • Hallo

    ich möchte gerne aus einem string den zeilenumbruch (also '\n') rauslesen. mit der CString-Funkion Find kann man ja die Position des ersten vorkommens rausfinden. wenn der string aber mehrzeilig ist, bringt mir das nichts, denn es wär nicht schlecht ( 😉 ) wenn ich alle positionen von \n kennen würde...
    könnt ihr mir bitte nen tipp geben??

    mfg



  • benutz den std::string, der bietet dir die möglichkeit, einen iterator zu übergeben, von dessen stelle er mit der suche beginnen soll,und liefert dir einen neuen iterator zurück.

    dh jedesmal wenn string::find ein "\n" findet liefert er dir gleich einen iterator, von dessen position du eine neue suche starten kannst, die dich dann zum nächsten "\n" bringt



  • könnt ihr mir bitte nen tipp geben??

    Verwende einfach eine Schleife in der du Find mit jeweils neuem Startindex aufrufst. Also 0, Pos-erstes-\n-, Pos-zweites-\n...



  • Hi,

    ich würde es mit std::string und std::vector so machen:

    std::vector<unsigned int> newline_vector;
    
    std::string der_string = "blub\nblub\nblub\nblub\nfoobar";
    
    std::string::iterator start = der_string.begin();
    std::string::iterator ende  = der_string.end();
    unsigned int pos = 0;
    while(start != ende)
    {
      if(*start == '\n')
         newline_vector.push_back(pos);
      ++pos;
      ++start;
    }
    

    Iteratoren und auch diese Variante haben den Nachteil das die Iteratoren bzw. Positionen ungültig werden sobald sich etwas im String verändert.

    MfG

    eViLiSSiMo



  • der tipp is gar ned schlecht... ,-)
    das probier ich gleich mal aus

    thx

    gibts ne möglichkeit die Anzahl der \n(s) zu finden?



  • sokrates schrieb:

    gibts ne möglichkeit die Anzahl der \n(s) zu finden?

    unsigned int lines = newline_vector.size();
    

    Wenn du das nach der Schleife ausführst hast du auch die Anzahl der '\n'-Zeichen

    MfG



  • muss ich dazu ne besondere header datei einbinden? er nimmt nämlich das newline nicht an ...



  • Was genau stört euch an?

    count(str.begin(), str.end(), '\n');
    

    Ich dachte es ginge hier um einen CString der MFC.



  • sokrates schrieb:

    muss ich dazu ne besondere header datei einbinden? er nimmt nämlich das newline nicht an ...

    ja, und zwar

    #include <vector> // für std::vector
    #include <string> // für std::string
    

    HumeSikkins schrieb:

    Was genau stört euch an?

    count(str.begin(), str.end(), '\n');
    

    Ich dachte es ginge hier um einen CString der MFC.

    eViLiSSiMo schrieb:

    ich würde es mit std::string und std::vector so machen:

    Ausserdem sind wir hier im C++ Forum und nicht im MFC Forum ... 🙄

    // Edit: Btw. Ich kenne CString und Co nicht. Daher habe ich das Bsp. gezeigt. MFC generell ist mir fremd.

    MfG



  • bin halt noch ein bisschen ein anfänger 🙂 ich glaub es wird mal zeit dass ich ein bisschen code poste:

    for(i = 0; i < k; i++)       //k ist die länge des strings
            {
                j = str.Find('\n', j); // int j = 0
                str2 = str.Left(j);    // Ausgabe fehlt hier
            }
    

    ich würde gern jedesmal wenn ein \n gefunden wurde den teil links davon der str2 variable zuweisen und ausgeben. Das Problem is jetz, dass j immer nur den Wert des 1. \n übernimmt und sich auch nicht ändert.



  • So und nu wieder mal ne std::string variante:

    // needs #include <string>
    //       #include <iostream>
    
    std::string der_string = "blub\nbla\nblubber\nfoobar\n";
    std::string::iterator start    = der_string.begin();
    std::string::iterator last_pos = start;
    std::string::iterator ende     = der_string.end();
    std::string str2 = "";
    
    while(start != ende)
    {
      if(*start == '\n')
      {
        str2.assign(last_pos,start);
        std::cout << str2 << std::endl;
        last_pos = start + 1;
      }
      else if(start +1 == ende)
      {
        str2.assign(last_pos,start + 1);
        std::cout << str2 << std::endl;
      }   
    
      ++start;
    }
    

    MfG



  • danke
    ich kapier nix.
    ich hab den code 1:1 übernommen, aber es entstehen 28 fehler und ein paar warnings...
    die benötigten headers hab ich eingebunden



  • Bei mir gibts keine Probleme.

    hmm ich hab aber auch VC++ sondern Dev-C++ mit dem MinGW Compiler (g++ 3.3.1)

    Zeig mal deine Fehlermeldungen..



  • es kommen immer so meldungen wie
    'std' : Keine Klasse oder Namespace
    'string' : nichtdeklarierter Bezeichner
    Syntaxfehler : Fehlendes ';' vor Bezeichner 'der_string'
    usw..



  • sicher, dass du #include <string> da stehen hast? welchen compiler benutzt du?



  • otze schrieb:

    sicher, dass du #include <string> da stehen hast? welchen compiler benutzt du?

    Er benutzt MFC daraus schließe ich mal VC++

    Die frage ist nur welches..

    Warscheinlich VC++6.0 Autorenversion

    MfG



  • kann es sein, dass der namespace std nicht eingebunden wurde:

    using namespace std;
    

    ??
    mfg arni



  • arni schrieb:

    kann es sein, dass der namespace std nicht eingebunden wurde:

    using namespace std;
    

    ??

    Nein, das braucht man nicht da mein code via "std::" auf den Namespace zugreift,

    daher kann man das weglassen.

    MfG



  • warum schreibst du das in dieser Art ?
    Hat es einen bestimmten Grund und welchen Vorteil hat es?
    Oder war das jetzt nur so in dem Beispiel?



  • Ich habe mir das angwöhnt um keine Namens konflikte zu bekommen

    Beispiel:
    Hier kommt es zu einem Namenskonflikt:

    #include <string>
    using namespace std;
    class string
    {
      public:
          string();
         ~string();
       void do_foo();
    };
    
    int main()
    {
      string blub; // Welcher ? Meiner oder der aus dem Header ?
    }
    

    Hier kommt es nicht zu einem Konflikt:

    #include <string>
    
    class string
    {
      public:
          string();
         ~string();
       void do_foo();
    };
    
    int main()
    {
      string      blub; // Meiner 
      std::string foobar; // der aus dem Header
    }
    

    Das waren auch nur Beispiele, ich verwende desweiteren auch andere C++ Libs die ihren namespace haben z.B. sigc++, boost oder u.a. Gtkmm
    Da kann es z.B. vorkommen das 2 Funktionen / Klassen den selben Namen haben

    Wenn ich dann:
    using namespace std;
    using namespace boost;

    schreibe kommt es zu konflikten.

    Ausserdem ist für den Leser des Codes genau erkennbar woher die Funktion/Klasse
    stammt.

    MfG


Anmelden zum Antworten