Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » std::string zerlegen

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 <
000
24.07.2003, 12:43 Uhr
~Bernhard
Gast


Hi!

Brauche Hilfe!

Ich habe einen String der sich bspw. so zusammensetzt:

"Bla1 1 2 3 4 5
Bla2 9 8 7
Bla4 12 22"

Mein Problem:

1) Ich muß diesen String "zeilenweise" also bis zum "/r/n" auslesen und

2) diese Zeile dann an eine Funktion übergeben, die mir alle weiteren Inhalte in Variablen wieder zurückgibt, deren Anzahl (!) variieren kann!

Bsp:


Code:
std::string str = "Bla1 1 2 3 4 5" // beinhaltet 6 Variablen-Inhalte



Die Funktion soll mir nun Bla1 und 1 und 2 und 3 und 4 und 5 in insgesamt 6 Variablen zurückliefern, damit ich diese dann in meinem Programm einsetzen kann.

Wenn ich dann aber


Code:
std::string str = "Bla2 9 8 7" // beinhaltet ja nur 4 Variablen-Inhalte



komme ich ins Schleudern.

Wie kann man solch ein Problem am elegantesten lösen?

Ich hoffe ich konnte mein Problem verständlich darlegen.

Gruß
Bernhard

P.s.: Ich benutze nicht die MFC (also kein CString) und setze auch nicht strtok oder dergleichen ein. Benutze z.Z. Visual c++ 6.0
Deswegen habe ich auch in dieses Forum gemailt und hoffe auch damit richtig zu liegen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.07.2003, 12:47 Uhr
typecast
aka loddab
(Operator)


Also für das einlesen kannst du die Funktion getline(stream, string) verwenden. Diese liest dir eine Zeile aus dem Stream aus.

Wenn du den String splitten willst, dann kannst du die Funktion std::isspace(char) verwenden. Sie gibt true zurück, wenn in deinem String ein "weißes Zeichen" gefunden wurde. Weiße Zeichen sind Leerzeichen, Tabs oder auch Zeilenumbrüche.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.07.2003, 12:49 Uhr
typecast
aka loddab
(Operator)


Oh und jetzt hab ich auch noch vergessen, wie du das mit den Unterschiedlichen Längen machen kannst: Nimm die Klasse std::vector<T> als Rückgabewert in deine Funktion auf. Diesen kannst du mi push_back(T) immer dann erweitern, wenn du einen neuen Variablenwert findest.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.07.2003, 12:54 Uhr
0xdeadbeef
Gott
(Operator)


Was du willst, ist einen Stringstream benutzen. Die grundsätzliche Handhabe ist so:

C++:
#include <string>
#include <sstream>

//...

std::string str = "Bla1 2 3 4", elem1;
std::stringstream mystream;
int zahl1, zahl2, zahl3;

mystream.str(str); //string, den mystream behandelt

mystream >> elem1 >> zahl1 >> zahl2 >> zahl3;



--Edit: Typo im Code verbessert. siehe nächste Nachricht
Für genaueres schau auf www.cplusplus.com/ref/iostream nach, die haben ne ziemlich gute Referenz zu dem Thema.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 24.07.2003 um 13:48 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.07.2003, 12:58 Uhr
typecast
aka loddab
(Operator)


Das wäre natürlich um einiges einfacher als meine Methode!
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.07.2003, 13:22 Uhr
~Bernhard
Gast


Hi!

Ich teste grad den Code von 0xdeadbeef.
Kriege Fehlermeldung in der Zeile:

s >> elem1 >> zahl1 >> zahl2 >> zahl3;

Was ist s ? [s = nichtdeklarierter Bezeichner]

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.07.2003, 13:30 Uhr
~Bernhard
Gast


Hi!

Also statt s hätte es mystream heißen müssen!

Dennoch beantwortet es nicht ganz meine Frage.

Ich stehe immer noch vor dem Problem, wie ich (wenn ich diesen Code nun in eine Funktion packe), dieser Funktion mitteile, ey es sind nicht 3 "Zahlen = Zahlx" sondern 5.

Ich meine also: Wie kann man es so formulieren, daß man bspw. in einer For-Schleife die Anzahl der "Zahlen" ermittelt und dann diese Zahlen (in der ermittelten Anzahl ) "!aus dieser Funktion" zurückgibt"

Wie könnte man das verallgemeinern, wenn ihr versteht, was ich meine!

Danke!

P.S.: Loddab's Ausführungen habe mich eher verwirrt, d.h. ich kann z.Z. nicht viel damit anfangen. Ist nicht böse gemeint, aber ich hab's einfach nicht so recht verstanden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.07.2003, 13:47 Uhr
0xdeadbeef
Gott
(Operator)


Nimm std::vector<int>. In diesem Fall

C++:
vector <int> zahlen;
int tmp;

while(!mystream.eof()) {
    mystream >> tmp;
    if(mystream.fail()) throw mystream.str();
    zahlen.push_back(tmp);
}


Das ist jetzt so dahingekladdet, aber das Prinzip wird, denke ich, klar.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: