2016-11-23 2 views
-1

Ich möchte toupper auf jedem char nach Punkt . in der string verwenden. Ich habe diesen Code versucht, aber ich erhalte einen schwarzen Bildschirm, wenn ich das Programm starte, wenn ich den Operator + benutze.Kann nicht string :: size_type + int toupper

string fulltext = "my name is John. i have a girlfriend. her name is Anna"; 

string::size_type idx = 0; 
while ((idx = fulltext.find(".")) != string::npos) 
{ 
    if (idx != string::npos) 
    { 

     fulltext[idx + 2] = toupper(fulltext[idx + 2]); 
    } 
} 
cout << fulltext << endl; 
+3

definieren "Es funktioniert nicht". Haben Sie zusätzlich den Debugger benutzt? –

+1

Wahrscheinlich, weil keine Inkrementierung von idx auftritt, werden Sie also eine Endlosschleife erhalten, bei der Sie das Zeichen "i" in ". I have" nach "oben" setzen. Vielleicht möchten Sie idx = fulltext.find (".", Idx + 1) verwenden. – Nonanon

+1

Auch einige andere Probleme in Ihrem Code: 1) Ihre 'if' -Klausel wird nicht benötigt, da die gleiche Bedingung im' while geprüft wird ', und wenn Sie in der Schleife sind, ist es bereits 'wahr'. 2) Wenn 'idx' einen gültigen Index in Ihrem String darstellt, bedeutet dies nicht automatisch, dass 'idx + 2' einen gültigen Index darstellt. –

Antwort

1

So stellt sich heraus, dass der einzige Standard definiert Art und Weise toupper zu verwenden ist eine unsigned char weitergeben müssen: https://stackoverflow.com/a/37593205/2642059 Somit ist der beste Weg, dies zu tun, ist mit einem Lambda in einem transform, zum Beispiel Sie nutzen könnten string fulltext in es ist vollständig wie folgt aus:

transform(cbegin(fulltext), cend(fulltext), begin(fulltext), [](const unsigned char idx){ return toupper(idx); }) 

Da Sie bei den ersten '.' und transform Arbeiten auf iterator s starten Sie nur find verwenden könnte eine iterator auf die erhalten '.' und es in der 1 st und 3 rd Argumente von transform verwenden: auto it = find(begin(fulltext), end(fulltext), '.') Aber wir das temporäre vermeiden können, wenn wir Iteration tun Reverse:

transform(crbegin(fulltext), make_reverse_iterator(find(cbegin(fulltext), cend(fulltext), '.')), rbegin(fulltext), [](const unsigned char idx) { return toupper(idx); }); 

Live Example