Array Elementfelder verschieben?



  • dachte der 2te paramter ist die länge(also ein int)!
    Bin mir aber grad nich sicher...hab kein Borland hier wo ich schauen kann!

    serial!



  • @Mathias
    http://www.cppreference.com/cppstring/replace.html

    @5er1al
    Laut der Referenz (oberer Link) müsstest Du Recht haben. Nur der erste Parameter, der Startindex, bezieht sich auf den "source-string" und der zweite Parameter soll überaschenderweise die Länge des "replace-strings" angeben. Diese war in diesem Fall natürlich 0 und nicht 1, was zu einer Endlosschleife führen würde, da 0 Zeichen mit 0 Zeichen ersetzt werden würden. Aber sowohl der VC 7.1 als auch der g++ 3.4.2 beziehen auch die Länge der Zeichen auf den "source-string". Welchen Compiler hast Du denn? Was macht er, wenn du den "replace-string" nicht als Konstante übergibst?
    Hier noch ein Beispiel mit konstanten "replace-strings"

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string a = "haxo", b = "wexxxt";
    
    	a.replace(2,1,"ll");
    	b.replace(2,3,"l");
    
    	cout << a << " " << b << endl;//hallo welt
    
    	cin.get();
    }
    

    und eins mit variablen "replace-strings"

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	string a = "haxo", b = "wexxxt", ra="ll", rb ="l";
    
    	a.replace(2,1,ra);
    	b.replace(2,3,rb);
    
    	cout << a << " " << b << endl;//hallo welt
    
    	cin.get();
    }
    

    Wie schon gesagt, mit g++ 3.4.2 und auch mit VC 7.1 funktioniert beides einwandfrei.



  • hm, wie schaut es damit aus:

    int main()
    {
    	std::string test = "0675h423a43l43255326426431l352o5436";
    
    	unsigned int Pos = 0;
    	while ( (Pos = test.find_first_of("1234567890")) != std::string::npos )	test.erase(Pos, 1);
    
    	std::cout << test << std::endl;
    
    	std::cin.get();
    
    	return 0;
    }
    

    Gruss,
    DeSoVoDaMu



  • ich schätze find_first_of fängt jedes mal ne schleife an.
    deshalb eher so wie schon gepostet nur mit erase:
    [cpp]
    #include <iostream>
    #include <string>

    using namespace std;

    inline void remDigits(string &s)
    {
    size_t i=0;

    while(i<s.length())
    if(isdigit(s[i]))
    s.erase(i,1);
    else
    ++i;
    }

    int main()
    {
    string a = "0675h423a43l43255326426431l352o5436", b = "5423w5423352e53324909785l89769t5647";

    remDigits(a);
    remDigits(b);

    cout << a << " " << b << endl;
    cin.get();
    }
    [/cpp]
    Aber mit welchem Compiler das mit replace nicht geht würde mich schon interessieren.



  • @nillable: ich weiß nich ob wir aneinander vorbei reden...
    ich meinte das:

    Mathias schrieb:

    s.replace(i,"1","");

    das geht bei BCB 6 nicht....logisch!

    Keine Übereinstimmung für string::replace(int,char*,char*) gefunden



  • Ups, wenn der 2.Parameter die Länge des zu ersetzenden Strings ist habt ihr natürlich recht.

    (Ehrlich gesagt hab ich mir mein Replace selbst geschrieben, weil ich keine so allgemeine Funktion gefunden habe, die man ohne Umwege fuer das gebrauchen kann wozu ich sie brauche...)



  • ich meinte eher das:

    5er1al schrieb:

    nillable schrieb:

    s.replace(i,1,"");

    hm....da bringt mein compiler nach wie vor einen fehler...

    denn dafür gibt es ja standardmäßig eine Übereinstimmung



  • nillable schrieb:

    ich meinte eher das:

    5er1al schrieb:

    nillable schrieb:

    s.replace(i,1,"");

    hm....da bringt mein compiler nach wie vor einen fehler...

    denn dafür gibt es ja standardmäßig eine Übereinstimmung

    oh ja da hatte ich mich wohl sehr schlecht ausgedrueckt!
    Das geht natürlich!



  • ich schätze find_first_of fängt jedes mal ne schleife an.

    Ja...und? 😕
    Es loest das Problem und das auch noch standard-konform, wie ich jetzt einfach mal behaupte, da ich nur Member-Funktionen von string benutze.

    Gruss,
    DeSoVoDaMu



  • DeSoVoDaMu schrieb:

    Es loest das Problem und das auch noch standard-konform

    Das schon, aber die Zeichen des strings in einem einzigen Schleifendurchlauf zu überprüfen ist auch standard-konform. Wieso soll man denn nach jedem Löschen eines Zeichens anfangen den string von vorne zu durchsuchen? Wenn schon mit find_first_of, dann so:
    [cpp]
    #include <string>
    #include <iostream>

    using namespace std;

    int main()
    {
    string test = "0675h423a43l43255326426431l352o5436";
    size_t Pos = 0;
    while ( (Pos = test.find_first_of("1234567890", Pos)) != string::npos )
    test.erase(Pos, 1);

    cout << test << endl;

    cin.get();

    return 0;
    }
    [/cpp]


Anmelden zum Antworten