PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : list<char*> aus string



cathartik
18-04-2007, 09:52
Hallo,

ich versuche einen String an den Leerzeichen aufzuteilen und die einzelenen Zeichenketten in einer STL-Liste list<char*> zu speichern.



list<char*> charlist;
string o1("gerd henni alf ulf robert fritz susi annett sandra");
istringstream isstream1(o1,ios_base::in);

while(!isstream1.eof())
{
char ch[10];
isstream1 >> ch;
charlist.push_back(ch);
}
Das mit dem String unterteilen Klappt auch soweit. Wenn ich die Zeichenkette mit push_back in die liste einfüge, hat sie genau immer den wert eines anderen Namens. Aber wenn ich mir anschliessend die Liesteneinträge ausgeben lasse wird immer nur die letzte Zeichenkette, also "sandra" ausgegeben.


list<char*>::const_iterator char_iter;
for (char_iter=charlist.begin();char_iter != charlist.end(); char_iter++)
{
printf("Eintrag: %s\n *char_iter);
}
Woran liegt das?

RHBaum
18-04-2007, 10:26
char ch[10]; // array mit fester laenge erstellen,Array wird ungueltig wenn man scope verlaesst
isstream1 >> ch; // INHALT des Arrays aus dem Stream ueberschreiben
charlist.push_back(ch); // Array (Zeiger, Adresse des Datenblocks) in die liste schreiben


Das heisst in deiner liste stehen die adressen der statisch angelegten Arrays die aber schon wieder ungueltig sind. Wenn "glueck" hasst, steht ueberall die selbe Adresse drin, weil das Array staendig angelegt / zerstoert wurde, so dass er immer den selben speicherblock nutzen konnte. Das da ueberhaupt noch nen String drinnesteht der auch noch korrekt nullterminiert ist, ist auch nur gleuck, da C seinen speicher da ned aufraeumen muss, und noch keiner druebergeschrieben hat .....

Besser:
Gleich mit QFile und QString arbeiten, das erleichtert dir die sache ungemein ...

Ciao ...
also ein

cathartik
18-04-2007, 14:39
Mit nem String anstelle von nem char Array funktionierts.

Danke.

locus vivendi
18-04-2007, 14:46
list<char*> charlist;
Diese Liste speichert nur Zeiger, die Strings werden nicht kopiert. Wenn du eine Liste von Strings haben willst, kannst du z.B. list<string> benutzen.


while(!isstream1.eof())
Mit solchen Konstruktionen muss man aufpassen. Es kann vorkommen das beim Auslesen von Daten aus einem Stream ein Fehler auftritt, ohne das Eof gesetzt wird. Dadurch ist es möglich das Eingabeschleifen nur mit einer solchen Abfrage im Schleifenkopf endlos laufen. In deinem konkreten Beispiel gibt es dieses Risiko nicht, aber du solltest dir dessen trotzdem bewusst sein.



{
char ch[10];
isstream1 >> ch;

Hier könnte es arge Probleme geben, sollte ein String zum Einlesen mal länger als 9 Byte sein...