Anzahl der Zeichen eines Strings ermitteln



  • 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



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

    schreibe kommt es zu konflikten.

    lol, nein nicht wirklich. boost ist als ergänzung zur std entwickelt worden, deshalb wird man die Namen dort auch sorgfältig ausgewählt haben. Gegen using spricht eigentlich nicht viel, weil man im Notfall immer noch genau die Namen, die nicht eindeutig sind, qualifizieren kann.
    Nur in Headern sollte man es keinesfalls benutzen.



  • kapiert.
    Danke für die ausführliche Erklärung.

    apropos boost : gibts irgendwo im Netz eine Art referenz 'Boost für Dummies'?

    danke
    arni



  • Optimizer schrieb:

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

    schreibe kommt es zu konflikten.

    lol, nein nicht wirklich. boost ist als ergänzung zur std entwickelt worden, deshalb wird man die Namen dort auch sorgfältig ausgewählt haben. Gegen using spricht eigentlich nicht viel, weil man im Notfall immer noch genau die Namen, die nicht eindeutig sind, qualifizieren kann.
    Nur in Headern sollte man es keinesfalls benutzen.

    Das war ein Beispiel! 🙄



  • wieder mal was über namensbereiche gelernt ,-)

    ich hab die header 100% eingebunden, und ich hab visual studio 6
    (sitz ja in ner firma und versuch das zu lernen)

    will das jetz ganz einfach machen...

    z.b. so:
    for (i = 0; i < länge_des_strings; i++)
    {
    if(str[i] == '\n')
    {
    ausgabe;
    }
    }

    so würds ja theoretisch gehen... oder gibts irgendwelche bedenken?
    😕



  • hier stand ein sch***


Anmelden zum Antworten