2013-08-19 13 views
7

Ich mag zu ändern, um einen C++ Zeichenfolge an einem bestimmten Index wie folgt ändern:C++, bester Weg, um eine Zeichenfolge an einem bestimmten Index

string s = "abc"; 
s[1] = 'a'; 

Ist der folgende Code gültig? Ist das ein akzeptabler Weg dies zu tun?

Ich habe keinen Hinweis finden, der sagt, es gilt:

http://www.cplusplus.com/reference/string/string/

die besagt, dass durch „überladenen Operator [] in String“ wir den Schreibvorgang durchführen können.

+0

Ja, kein Problem überhaupt zu erreichen. Wenn Sie wirklich eine Referenz wollen, Abschnitt 21.4.5/2 des C++ 11 Standards. –

+5

Ugh. In C++ 11 ist dies aufgrund eines Defekts im Standard eigentlich verboten, und Sie müssen * technisch * 's.begin() [1] = 'a' verwenden;' Aber es lohnt sich nicht, sich darüber Gedanken zu machen. – Potatoswatter

+0

Und Sie * fanden * eine Referenz, die besagt, dass sie gültig ist, obwohl cplusplus.com im Allgemeinen minderwertig und oft veraltet ist. In Anbetracht des Links ist es unklar, was Sie sonst noch wissen möchten. – Potatoswatter

Antwort

9

Ja, die folgende C++ Programm:

#include <iostream> 

int main() { 
    std::string s = "abc"; 
    s[1] = 'a'; 
    std::cout << s; 
} 

druckt aac. Sie riskieren versehentlich in nicht zugewiesenen Speicher schreiben, wenn String s Leerzeichen ist. C++ lässt Sie das tun und es führt zu undefiniertem Verhalten.

Der sichere Weg, dies zu tun wäre string::replace zu verwenden: http://cplusplus.com/reference/string/string/replace

+1

Die sichere Version wäre die Verwendung von string :: replace http://www.cplusplus.com/reference/string/string/replace/ – Chris

1

Ja. Die Website, die Sie verlinken, hat eine Seite darüber. Sie können auch eine Funktion verwenden, die die Überprüfung von Grenzen durchführt.

http://www.cplusplus.com/reference/string/string/operator%5B%5D/

+1

@Potatoswatter Warum? Der Punkt war, dass der Programmierer wählen könnte, um Grenzen zu prüfen. –

+0

@NeilKirk: Ich kann mir vorstellen, dass sich das ändert, weil alle nur annahmen, dass die Überprüfung durchgeführt wurde, und nicht von "at()" wusste. – cHao

+2

@Potatoswatter einen Scheck für was? Die Funktion wird entweder mit einer gültigen Position (unter Berücksichtigung von * one * null terminator) aufgerufen oder das Verhalten ist nicht definiert. Siehe Requires-Klausel. –

1

Ja der Code, den Sie geschrieben haben, gültig ist. Sie können auch versuchen:

string num; 
cin>>num; 
num.at(1)='a'; 
cout<<num; 

**Input**:asdf 
**Output**:aadf 

die std :: ersetzen kann auch verwendet werden, um die Schrift zu ersetzen. Hier ist der Referenzlink http://www.cplusplus.com/reference/string/string/replace/

Hoffe das hilft.

0

Sie Teilzeichenfolge verwenden könnte dies

string s = "abc"; 
    string new_s = s.substr(0,1) + "a" + s.substr(2); 
    cout << new_s; 
    //you can now use new_s as the variable to use with "aac" 
Verwandte Themen