Kurze Frage zu string in Schleife



  • Sehe ich das hier richtig das irgendwann auf ein Element zu viel zugegriffen wird?
    Ich meine der string ist 8 Zeichen lang irgendwann wird gefragt:

    if(Data[i]=='3'&&Data[i+1]=='0')
    

    Data[i+1] <-- Darum geht es, da greife ich doch im Prinzip auf einen Wert zu der nicht mehr der Variable Data gehört oder?

    string Data = "30ABC30C";
    		 for(unsigned i=0; i<Data.length();i++)
    		 {
    			if(Data[i]=='3'&&Data[i+1]=='0')
    			{
    				Data[i]='0';
    				Data[i+1]='0';
    			}
    		 }
    


  • Ja.



  • for(unsigned i=0; i<Data.length();i++) 
             { 
                if(Data[i]=='3'&&Data[i+1]=='0') 
                { 
                    Data[i]='0'; 
                    Data[i+1]='0'; 
                } 
             }
    

    Wer iteriert denn so durch einen String? ts, ts...
    Egal.Du musst die Bedingung ändern, zu

    i + 1 < Data.length()
    

    Dann dürfte es funktionieren.



  • Und das hier:

    Data[i+1]='0';
    

    ist überflüssig.



  • Gute Güte. Wie wäre es einfach mit find?
    http://www.cplusplus.com/reference/string/string/find/



  • wstr schrieb:

    string Data = "30ABC30C";
    		 for(unsigned i=0; i<Data.length();i++)
    		 {
    			if(Data[i]=='3'&&Data[i+1]=='0')
    			{
    				Data[i]='0';
    				Data[i+1]='0';
    			}
    		 }
    

    Besser:

    string Data = "30ABC30C";
        for( string::size_type i = 0; (i = Data.find("30", i)) != string::npos; ++i )
            Data.replace( i, 2, "00");
    


  • Ha, jetzt v´wo ich überhaupt verstanden habe was er will... (!!)

    std::string str("30a651we30");
            size_t pos;
            while((pos = str.find("30")) != std::string::npos)
                    str[pos] = '0';
    

    Edit: thx an Sepp.



  • Sone schrieb:

    Wer iteriert denn so durch einen String? ts, ts...
    Egal.Du musst die Bedingung ändern, zu

    Wie macht man es den richtig? Sollte man nicht sowas wie:

    if(Data[i]=='3')
    {
     // tu irgendwas verwende
    }
    

    Nicht verwenden und dann besser auf die find Funktion zurückgreifen?


  • Mod

    Sone schrieb:

    Oder die weitaus kryptischere C++-Variante (wobei ich keinen Grund sehe sie obigem vorzuziehen):

    Und der notwendige const_cast ist für dich kein Hinweis, dass deine C-Variante eventuell riskant sein könnte ist?

    edit: Du benutzt ja sogar data(), das ist sogar garantiert falsch, da data() bei einigen Implementierungen bekanntermaßen nicht nullterminiert ist (braucht es schließlich auch nicht sein).


  • Mod

    wstr schrieb:

    Sone schrieb:

    Wer iteriert denn so durch einen String? ts, ts...
    Egal.Du musst die Bedingung ändern, zu

    Wie macht man es den richtig? Sollte man nicht sowas wie:

    if(Data[i]=='3')
    {
     // tu irgendwas verwende
    }
    

    Nicht verwenden und dann besser auf die find Funktion zurückgreifen?

    Deine Variante ist schon ok so, nachdem du den Fehler behebst.



  • SeppJ schrieb:

    Sone schrieb:

    Oder die weitaus kryptischere C++-Variante (wobei ich keinen Grund sehe sie obigem vorzuziehen):

    Und der notwendige const_cast ist für dich kein Hinweis, dass deine C-Variante eventuell riskant sein könnte ist?

    edit: Du benutzt ja sogar data(), das ist sogar garantiert falsch, da data() bei einigen Implementierungen bekanntermaßen nicht nullterminiert ist (braucht es schließlich auch nicht sein).

    ouch, ouch, ouch. Das war wohl ganz krasser C-Mist. ⚠
    http://en.cppreference.com/w/cpp/string/basic_string/data
    Ich dachte, es ist dasselbe wie bei std::vector::data 😃


Anmelden zum Antworten