zeichenkette in string ersetzen



  • hallo... ich bin neu, habe aber in den faq nicht das passende gefunden. ich möchte gerne in einem string eine bestimmt zeichenkette durch eine andere (die nicht die selbe länge hat) ersetzen. bislang stehe ich hier:

    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h> 
    
    int main()
    {
          char meinString[] ="Ich wohne im siebten Stock";
          char * pch;
          pch = strstr (meinString,"siebten");
          strncpy (pch,"neunten",7);
          puts (meinString);
    
          system("PAUSE");
          return 0;
    }
    

    leider geht das nur mit gleichlangen zeichenketten... wenn ich nun "siebten" durch "8." ersetzen wollen würde, geht das nicht. kann mir jemand die lösung nennen.
    danke im vorraus.



  • Die Lösung bietet die Klasse string der STL.

    grüße



  • ich würd das ja so machen:

    char text[100] = {0};

    sprintf("Ich heiße %s !!!\n", text, "Peter");
    sprintf("Ich heiße %s !!!\n", text, "Hans");



  • Stu123 schrieb:

    ich würd das ja so machen:

    char text[100] = {0};

    sprintf("Ich heiße %s !!!\n", text, "Peter");
    sprintf("Ich heiße %s !!!\n", text, "Hans");

    es geht nicht daraum was auszugeben. ich will lediglich den string verändern...



  • David_pb schrieb:

    Die Lösung bietet die Klasse string der STL.

    grüße

    ich habe mir unter www.cplusplus.com die stringklasse angesehen, doch leider nichts gefunden. oder was meinst du mit "STL"? sorry, bin leider nicht so bewandert.





  • Hi!

    Die Standard Template Library: siehe auch http://www.cppreference.com/cppstring/index.html

    grüße



  • miller_m schrieb:

    http://cplus.kompf.de/artikel/strings.html

    das suchte ich, danke



  • steven23 schrieb:

    es geht nicht daraum was auszugeben. ich will lediglich den string verändern...

    sprintf gibt nichts aus, es schreibt lediglich einen Text in einen String 😉

    Anyway, mit string bist Du hier im C++ Bereich eh besser bedient.



  • habe mal noch eine frage/fehler und find die lösung nicht

    int main()
    {
    
    vector<string> tabelle;
    tabelle.push_back("Strasse");
    tabelle.push_back("Weg");
    tabelle.push_back("Bruecke");
    tabelle.push_back("Tunnel");
    
    string meinString = "Ich fahre eine *0 entlang, ueber eine *2 und biege rechts in einen kleinen *1 ein, der durch einen *3 fuehrt.";
    string::size_type laenge = meinString.size();
    
    for (int i=0;i<laenge;i++){
    if (meinString[i]=='*'){
    meinString.replace(meinString.find("*"), 2, tabelle[meinString[i+1]]);
    i=0;
    }
    }
    
    cout << meinString << "\n";
    
    system("PAUSE");
    return 0;
    }
    

    hier soll meinString nach "" durchsucht werden und die nächste stelle nach "" beinhaltet die zeilennummer des vectors, durch die "*" und die zeilennummer ersetzt werden sollen...
    immer wenn ich das script ausführe, hängt es sich auf? weiß jemand eine lösung?



  • steven23 schrieb:

    Immer wenn ich das Script ausführe, hängt es sich auf?

    Ja. Du greifst auf Speicher zu, der nicht dir gehört. Überprüf' doch 'mal die Werte von meinString[ i + 1 ]:

    for( int i = 0; i < laenge; i++ ) {
    
        if( meinString[ i ] == '*' ) {
    
            meinString.replace(meinString.find( "*" ), 2, tabelle[ meinString[ i + 1 ] ] );
            //                                  ^
            // wieso ein String als Argument für string::find( )?
    
            i=0;
        }
    }
    

    Fällt dir was auf!?

    steven23 schrieb:

    Weiß jemand eine Lösung?

    Ja:

    #include <vector>
    #include <string>
    #include <locale>
    #include <iostream>
    
    using namespace std;
    
    int main( )
    {
        vector< string > table;
        table.push_back( "Strasse" );
        table.push_back( "Weg" );
        table.push_back( "Bruecke" );
        table.push_back( "Tunnel" );
    
        string text = "Ich fahre eine *0 entlang,\n"
                      "ueber eine *2 und biege rechts in einen kleinen *1 ein,\n"
                      "der durch einen *3 fuehrt.";
    
        cout << "Text to replace with tokens:" << endl;
        cout << text << endl << endl;
    
        locale germany( "German_Germany" );
    
        string::size_type offset = 0;
    
        for( vector< string >::size_type i = 0; i < table.size( ); ++i ) {
    
            offset = text.find( '*', offset );
    
            if( isdigit( text[ offset + 1 ], germany ) ) {
    
                text.replace( offset++, 2, table[ text[ offset ] - '0' ] );
            }
        }
    
        cout << text << endl;
    }
    

    Rück' das nächste mal vernünftig ein und benutz "cpp"-Tags!

    Greetz, Swordfish



  • ah, jetzt hab ich´s geschnallt... besten dank



  • mmm, ein problem hab ich allerdings noch. die for schleife richtet sich jetzt nach der anzahl der begriffe im vector. leider habe ich auch manchmal strings, bei denen nicht alle begriffe aus dem tabel benutzt werden. die for schleife müsste also eher den string nach * durchsuchen... aber wie?



  • p.s. die erste version von dir funktionierte. nach deiner überarbeitung gehts nun leider nicht mehr. folgende fehlermeldung spuckt er aus: cpp:3: locale: No such file or directory ???



  • Ist auch keine Hexerei:

    #include <vector>
    #include <string>
    #include <locale>
    #include <iostream>
    
    using namespace std;
    
    int main( )
    {
        vector< string > table;
        table.push_back( "Strasse" );
        table.push_back( "Weg" );
        table.push_back( "Bruecke" );
        table.push_back( "Tunnel" );
    
        string text = "Ich fahre eine *0 entlang,\n"
                      "ueber eine *2 und biege rechts in einen kleinen *1 ein,\n"
                      "der durch einen *3 fuehrt.";
    
        cout << "Text to replace with tokens:" << endl;
        cout << text << endl << endl;
    
        locale germany( "German_Germany" );
    
        string::size_type offset = text.find( '*' );
    
        while( offset != text.npos ) {
    
            if( isdigit( text[ offset + 1 ], germany ) ) {
    
                text.replace( offset, 2, table[ text[ offset + 1 ] - '0' ] );
            }
    
            offset = text.find( '*', ++offset );
        }
    
        cout << text << endl;
    }
    

    Greetz, Swordfish



  • danke, aber wie gesagt, selber fehler... er hat ein problem mit "#include <locale>" glaube ich... ???



  • Dann unterstützt dein Compiler den C++ Standard ISO/IEC 14882:1998 nicht!

    ISO/IEC 14882:1998 schrieb:

    17.4.1.2 Headers

    1 The elements of the C++ Standard Library are declared or defined (as appropriate) in a header.
    2 The C++ Standard Library provedes 32 C++ headers, as shown in Table 11:

    Table 11 - C++ Library Headers

    <algorithm>   <iomanip>    <list>       <ostream>      <streambuf>
    <bitset>      <ios>        <locale>     <queue>        <string>
    <compex>      <iosfwd>     <map>        <set>          <typeinfo>
    <deque>       <iostream>   <memory>     <sstream>      <utility>
    <exception>   <istream>    <new>        <stack>        <valarray>
    <fstream>     <iterator>   <numeric>    <stdexcept>    <vector>
    <functinoal>  <limits>
    

    [...]

    Welchen Compiler benutzt du?

    Verwende inzwischen:

    #include <vector>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main( )
    {
        vector< string > table;
        table.push_back( "Strasse" );
        table.push_back( "Weg" );
        table.push_back( "Bruecke" );
        table.push_back( "Tunnel" );
    
        string text = "Ich fahre eine *0 entlang,\n"
                      "ueber eine *2 und biege rechts in einen kleinen *1 ein,\n"
                      "der durch einen *3 fuehrt.";
    
        cout << "Text to replace with tokens:" << endl;
        cout << text << endl << endl;
    
        string::size_type offset = 0;
    
        for( vector< string >::size_type i = 0; i < table.size( ); ++i ) {
    
            offset = text.find( '*', offset );
    
            if( isdigit( text[ offset + 1 ] ) ) {
    
                text.replace( offset++, 2, table[ text[ offset ] - '0' ] );
            }
        }
    
        cout << text << endl;
    }
    

    bzw.

    #include <vector>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main( )
    {
        vector< string > table;
        table.push_back( "Strasse" );
        table.push_back( "Weg" );
        table.push_back( "Bruecke" );
        table.push_back( "Tunnel" );
    
        string text = "Ich fahre eine *0 entlang,\n"
                      "ueber eine *2 und biege rechts in einen kleinen *1 ein,\n"
                      "der durch einen *3 fuehrt.";
    
        cout << "Text to replace with tokens:" << endl;
        cout << text << endl << endl;
    
        string::size_type offset = text.find( '*' );
    
        while( offset != text.npos ) {
    
            if( isdigit( text[ offset + 1 ] ) ) {
    
                text.replace( offset, 2, table[ text[ offset + 1 ] - '0' ] );
            }
    
            offset = text.find( '*', ++offset );
        }
    
        cout << text << endl;
    }
    

    Greetz, Swordfish



  • habs nun so gemacht und es funktioniert... wuuste sowieso nicht, wozu die local da ist!?

    #include <vector>
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main( )
    {
        vector< string > table;
        table.push_back( "Strasse" );
        table.push_back( "Weg" );
        table.push_back( "Bruecke" );
        table.push_back( "Tunnel" );
    
        string text = "Ich fahre eine *0 entlang,\n"
                      "ueber eine *2 und biege rechts in einen kleinen *1 ein,\n"
                      "der durch einen *3 fuehrt.";
    
        string::size_type offset = text.find( '*' );
    
        while( offset != text.npos ) {
    
               text.replace( offset, 2, table[ text[ offset + 1 ] - '0' ] );
               offset = text.find( '*', ++offset );
        }
    
        cout << text << endl;
        system("PAUSE");
    }
    


  • ahja, danke... der zweite funktioniert. ich benutze dev-c++
    danke.



  • Zeichen können in verschiedenen Sprachen anders interpretiert werden. Für verschiedene Zeichensätze gibt es <locale>.

    Zu prüfen, ob das Zeichen nach '' eine Ziffer ist kann auf jeden Fall nicht schaden, da du, wenn du '' als "normalen" text verwendest Probleme bekommst. Weiters wäre es nett, zu Prüfen, ob der Index für deinen vector überhaupt gültig ist.

    Greetz, Swordfish


Anmelden zum Antworten