Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » String.insert()

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 <
000
17.12.2008, 18:11 Uhr
KFC Embryo
Ein Huhn


Hi,

ich habe mal eine Frage.
Was ist an dem folgendem Code Schnipsel falsch? Bekomme immer einen Laufzeitfehler.


Code:


int i=0;
int count=0;
    
    while(b[i]){
        if(b[i]=='H'){
            b.insert(b[i], "O");
                t += b[i];
            cout << t[i];
            count++;
        }else{
            t += b[i];
            cout << t[i];                
            i++;
        }
    }
return count;
}




Hat jemand eine Ahnung?

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?

Dieser Post wurde am 17.12.2008 um 18:11 Uhr von KFC Embryo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2008, 20:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


was ist b? evtl b uninitialisiert oder i außerhalb des gültigen bereichs?
--
class God : public ChuckNorris { };

Dieser Post wurde am 17.12.2008 um 20:28 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.12.2008, 09:51 Uhr
KFC Embryo
Ein Huhn


Also der genaue Fehler des Abbruchs lautet:


Zitat:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the applications support team for more information.



Die Funkion ist eine Methode vom Typ int.
t ist ein Member vom Typ string
b ist auch vom Typ string und eine lokale Variable die im Funktionskopf deklariert wurde.


Code:

int MyString::eraseLeadingWS(string b=""){ <-------------- Neu (b="")
    
    int i=0;
    int count=0;
    
    while(b[i]<b.length()){                     <--------------- Neu (b.length())
        if(b[i]=='H'){
            b.insert(b[i], "O");
                 t += b[i];
            cout << t[i];
            count++;
            i++;                               <-------------- Neu (i++)
        }else{
            t += b[i];
            cout << t[i];                
            i++;
        }
    }
return count;
}




Es soll die Anzahl der Ersetzungen von H durch O gezählt und zurückgegeben werden.
Die Funkion trägt den Namen dessen was sie später machen soll, dass hier mit dem H ist nur ein Test.

Wenn ich b mit "" initialisiere und while(b[i]<b.length) schreibe, bekomme ich den selben Fehler.

Desweiteren ist mir aufgefallen das ich dem if Teil keinen counter hatte (i++).
Aber auch daran hat es nicht gelegen.

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.12.2008, 10:51 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Was soll denn

C++:
while(b[i]<b.length()){                


deiner Meinung nach bezwecken?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.12.2008, 16:08 Uhr
0xdeadbeef
Gott
(Operator)


Wenn es um Ersetzung geht, ist insert nicht der richtige Weg - insert fügt ein. Auch, wie Guybrush richtig anmerkt, brauchen Operationen auf Positionen die Position, und nicht das, was an der Position steht.

Wenn ich richtig verstehe, was du da vorhast:

C++:
int i = 0;

t.clear();
while(i < b.size()) {
  if(b[i] == 'H') {
    t += 'O';
  } else {
    t += b[i];
  }
  ++i;
}


bzw. kürzer:

C++:
t.clear();
for(int i = 0; i < b.size(); ++i) {
  t += b[i] == 'H' ? 'O' : b[i];
}



Wobei der Guru natürlich

C++:
t.clear();
t.reserve(b.size());
std::replace_copy(b.begin(), b.end(), std::back_inserter(t), 'H', 'O');


schreibt. (Dafür <algorithm> und <iterator> #includen)
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.12.2008, 23:06 Uhr
KFC Embryo
Ein Huhn


Jetzt habe ich noch 2 abschließende Fragen:

Wie kann ich auf ein Leerzeichen prüfen?
Und wie kann ich es löschen?

Gruß
--
An nescis, mi fili, quantilla prudentia mundus regatur?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.12.2008, 23:20 Uhr
0xdeadbeef
Gott
(Operator)


Im gleichen Übertragungsszenario halt im if-statement auf ' ' prüfen und ggf. nicht übertragen -

C++:
t.clear();
for(int i = 0; i < b.size(); ++i) {
  if(b[i] == 'H') {
    t += 'O';
  } else if(b[i] != ' ') {
    t += b[i];
  }
}


Wenn's darum geht, Leerzeichen aus einem String zu löschen, std::string hat eine Methode "erase," die unter anderem eine Position (als size_type) und eine Länge entgegennimmt:

C++:
std::string s = "012345";
s.erase(3, 2); // löscht 2 Zeichen von Index 3 an, in diesem Fall "34"


Wenn's darum geht, das erste Nicht-Leerzeichen in einem String zu finden, was du wohl schlussendlich brauchen wirst,

C++:
std::string s = "   foo bar";
std::string::size_type index = s.find_first_not_of(' '); // 3


Siehe auch www.sgi.com/tech/stl/basic_string.html
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 18.12.2008 um 23:21 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


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: