sscanf() mit strings

thooomy

Erfahrenes Mitglied
moin Freunde,

ich glaub ich hab da ein Verständnissproblem... ich bin vor kurzen
von char* auf std::string umgestiegen und stoße auf folgendes:
kann mir einer sagen warum das nicht funktioniert:

Code:
int main (){
  std::string aloha;
  std::string hawaii = "sowas blödes aber auch ";


  if ( sscanf( hawaii.c_str(), "sowas %s blödes", &aloha) > 0 ) {
    cout << aloha ;
  }
}

(der ausgabe string ist immer leer obwohl sscanf eine 1 zurückliefert)

gibt es einen Alternativvorschlag für diese Funktion eurerseits, bzw. was habe ich falsch gemacht ?

Danke !
 
Sagen wir mal sscanf ist eine dermassen gefährliche Funktion, die nicht mal ich als Verfechter der printf-Befehle anpacke.

Der erste Parameter als Quelle der Daten mit c_str geht ja, allerdings müsstest du für den aloha da auch aloha.c_str() verwenden. Dann wird der Compiler motzen, wegen dem const. Das könnte man wegcasten. Bevor jetzt alle aufkreischen: Das geht dann in undefinierte Gefilde, weil der c_str-Operator nur zur Ausgabe dient, nicht als Input für einen String. Davon rate ich tunlichst ab.

Wenn du ums Verrecken da sscanf drin haben willst, würde ich einen Dummy-Char-Puffer machen und denn dann später zuweisen oder tatsächlich auf stringstreams umsteigen (hab ich das wirklich getippt?).

Übrigens, bei deinem Beispiel IST kein Text zwischen deinen Suchwörtern. Du meinst wahrscheinlich "sowas %s aber auch".
 
Endurion hat gesagt.:
Bevor jetzt alle aufkreischen: Das geht dann in undefinierte Gefilde, weil
Das wollte ich sogar gerade machen. ;)

Endurion hat gesagt.:
Wenn du ums Verrecken da sscanf drin haben willst, würde ich einen Dummy-Char-Puffer machen und denn dann später zuweisen oder tatsächlich auf stringstreams umsteigen (hab ich das wirklich getippt?).
Also ich würde nicht grad sagen das ich das "ums Verrecken" drin haben will , aber es gibt
keine so schöne Funktion in STL für strings (soweit ich ich weis). Die .find() Methoden find
ich da eher unsgünstig, da sie immer nur iteratoren zurückgeben und dadurch muss man dann mehre Operationen durchführen um substrings zu extrahieren....
Wenn einer ne schöne Funktion hat : Bitte Melden !

Endurion hat gesagt.:
Übrigens, bei deinem Beispiel IST kein Text zwischen deinen Suchwörtern. Du meinst wahrscheinlich "sowas %s aber auch".

ööhm ja das stimmt ;) - aber das war nich der Fehler ...
 
Ja, die Stringstreams können das wohl (ähnlich) einfach (ich finde einfach die Syntax nicht so prickelnd):

std::stringstream strStream;

strStream.str( "sowas blödes aber auch " );

std::string strSowas;
std::string strBloedes;
std::string strAber;
std::string strAuch;

strStream >> strSowas >> strBloedes >> strAber >> strAuch;

Falls ich die Reihenfolge vertauscht habe, habe ich das gar nicht, sondern dein Monitor steht falschrum.
Hinweis: Der >> operator beim stringstream liest bis zum nächsten Space. Kann dafür aber auch ints oder floats verwursten.


Bestimmt gibt's in der Boost etwas, das genau alles richtig macht, aber da muss dir jemand anders bei helfen.

[edit: keine Umlaute in Variablennamen]
[edit: Himmel A**** und Dingens, jetzt auch noch ein Semikolon vergessen]
 
Danke erstmal

mmh ja also, das ist nicht gerade ne schöne Lösung - denn ich sollte schon etwas
weniger speicherfressend programmieren (ausserdem nützt es mir nicht viel Daten wortweise auszulesen, von denen ich nicht weiss in welcher Reihenfolge und wie lang sie sind; ausserdem sollen tw. auch mehrere Wörter auf einmal gespeichert werden
und die besagten strings sind auch tief in meine Strukturen verschachtelt)

Aber dies konntest du ja nicht wissen ;).
Insofern muss ich mir wohl einen schlauen aolgorithmus mit Iteratoren ausdenken...
 

Neue Beiträge

Zurück