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 austhx
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 habenWenn 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