Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » suche eine Funktion mit der ich einen string parsen kann

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 < [ 2 ]
000
21.04.2006, 10:01 Uhr
Poffelnator



Ich suche eine Funktion mit der ich einen string parsen kann, also ein äquivalent zu strtok() für c-strings. Oder geht das nur über strtok(mystring.c_str()," "); wenn es überhaupt so gehen sollte!? Wenn ja wie, da erhalte ich immer folgende Fehlermeldung:

error C2664: 'strtok' : Konvertierung des Parameters 1 von 'const char *' in 'char *' nicht moeglich

Habe auch leider hier vergessen: ist mal wieder ein crosspost von mir.

www.spotlight.de/zforen/cpp/m/cpp-1145605421-28028.html

Dieser Post wurde am 21.04.2006 um 10:37 Uhr von Poffelnator editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.04.2006, 10:32 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das liegt wohl daran das die c._str() ein const char* liefert. auf dem speicherbereich sollst du also gar nicht erst rummüllen... Wenn du das unbedingt mit strtok machen willst erst mystring in einen zwischenspeicher kopieren mit strcpy...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.04.2006, 10:42 Uhr
Poffelnator



Sorry wenn ich so dumm frage, aber wie ist das gemeint? Soll ich also den string in ein char *my_string umwandeln? Also eine kleine swap- Funktion für strings?

P.S. Sorry mal zwei, dass ich jetzt so rum nerv, aber ich habe erst wieder im Sonntag einen Internetanschluss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.04.2006, 10:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Dein mystring.c_str() liefert dir nur einen zeiger auf einen speicherbereich in dem deine "buchstaben und zeichen" stehen. Der Inhalt auf den dieser Zeiger zeigt ist aber für dich nur zum lesen. Schreiben ist tabu. Da strtok auf dem speicher rummült musst du wenn du es verwenden willst in dem falle erst selber speicher bereitstellen in den du das worauf mystring.c_str() zeigt kopierst... damit kannst du dann weiter arbeiten...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.04.2006, 11:13 Uhr
ao

(Operator)


strtok macht ja noch kein Parsing, sondern nur den ersten Schritt dazu, die Tokensuche. Das geht auf C++-Strings auch ohne Umweg mit std::string::find_first_of.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.04.2006, 19:14 Uhr
Poffelnator



Ja genau will ja erst einmal nur die token haben. Habe aber leider keine Funktion gefunden die das macht ausser strtok. Wie soll das mit find first of gehen? bekomme ich nicht hin. hast du vielleicht ein paar Beispielzeilen? Was gebe ich beim Index ein? Diese Funktion liefert doch nur die erste Stelle des Vorkommens vom ersten Trennzeichen und dann? Wenn ich den index rauf setzte liegert er immer noch das erste zeichen?
Dieser Post wurde am 23.04.2006 um 19:20 Uhr von Poffelnator editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
23.04.2006, 23:58 Uhr
Poffelnator



Wie ich es jetzt gemacht habe!

string satz, sub;
int schritt, index;
schritt = satz.find_first_of(" ",index);
sub = satz.substr(index,schritt-index);
index = schritt +1;
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.04.2006, 07:37 Uhr
Spacelord
Hoffnungsloser Fall


Hallo,
mit C++ wäre der Weg eher über nen stringstream und nen istream_iterator.

C++:
#include <iostream>
#include <vector>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;

int main()
{
    vector<string> vec;
    string s("das ist ein String mit whitespaces");
    stringstream sstr(s);
    istream_iterator<string> in(sstr),end;
    for(;in != end;++in)
        vec.push_back(*in);
    
    //gefundene Elemente ausgeben
    copy(vec.begin(),vec.end(),ostream_iterator<string>(cout,"\n"));
    cout<<endl;

    return 0;
}



MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.04.2006, 09:14 Uhr
Poffelnator



Warum? Außerdem glaube ich dass dein Programm dann doch noch mein können in c++ übersteigt. Aber bestimmt nicht mehr lang.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.04.2006, 15:54 Uhr
Helmut




C++:
/*
Hallo!
Ich will mich in die STL einarbeiten und hab deine Aufgabe
in eine kleine Funktion geschrieben. Hier das Ergebnis.
Ich nehme jetzt Poffelnatoors Lösungsvorschlag und den von Spacelord
auf den Prüfstand und poste mein Ergebnis.*/


#include <iostream>
#include <string>
#include <sstream>

using namespace std ;

#define TOKEN_MAX 100
int gebe_token(const string&, string*, int);

int main()
{
    string s1= "int gebe_token() filtert Leerzeichen \t\t \v usw.\n vertikale und
     horizontale      Tabulatoren Zeilenumbrueche usw."
;

    string s2[TOKEN_MAX];
        
    for(int i = 0, tokenanzahl = gebe_token(s1, s2, TOKEN_MAX); s2[i].size(); ++i)
        cout << s2[i] << endl;
    return 0;
}

int gebe_token(const string& string_in, string* s_out, int token_max)
{
   istringstream ist(string_in);
   int tokenanzahl = 0;
   while((ist >> s_out[tokenanzahl++]) && (tokenanzahl < token_max)) ;  
   return tokenanzahl;
}                          





Bearbeitung von ao:
kaputte cpp-Tags repariert.

Dieser Post wurde am 24.04.2006 um 16:08 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: