2013-08-19 2 views
7

Я хочу изменить строку C++ с определенным индексом, например так:C++, лучший способ изменить строку в определенном индексе

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

Является ли следующий код действительны? Это приемлемый способ сделать это?

я не нашел какие-либо ссылок, который говорит, что это справедливо:

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

Который говорит, что через «перегруженный оператор [] в строке» мы можем выполнить операцию записи.

+0

Да, вообще никаких проблем. Если вам действительно нужна ссылка, раздел 21.4.5/2 стандарта C++ 11. –

+5

Ugh. В C++ 11 это фактически запрещено из-за дефекта в стандарте, и вы * технически * должны использовать 's.begin() [1] = 'a';' Но это не стоит беспокоиться. – Potatoswatter

+0

И вы * * нашли ссылку, в которой говорится, что она действительна, хотя cplusplus.com обычно не соответствует стандартам и часто устаревает. Учитывая ссылку, неясно, что еще вы хотите знать. – Potatoswatter

ответ

9

Да, следующий C++ программе:

#include <iostream> 

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

печатает aac. Вы рискуете случайно записать в незаписанную память, если строка s является пустой строкой. C++ позволит вам это сделать, и это приводит к неопределенному поведению.

безопасный способ сделать это было бы использовать string::replace: http://cplusplus.com/reference/string/string/replace

+1

Безопасной версией будет использование string :: replace http://www.cplusplus.com/reference/string/string/replace/ – Chris

1

Да. На сайте, на котором вы ссылаетесь, есть страница об этом. Вы также можете использовать функцию, которая выполняет проверку границ.

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

+1

@Potatoswatter Почему? Дело в том, что программист мог бы использовать проверку границ. –

+0

@NeilKirk: Я предполагаю, что это меняется, потому что все просто * предполагали *, что проверка границ делалась, и не знал о 'at()'. – cHao

+2

@Potatoswatter чек на что? Функция либо вызывается с допустимой позицией (с учетом * одного нулевого терминатора), либо поведение не определено. См. Раздел «Требуется». –

1

Да код, который вы написали справедливо. Вы также можете попробовать:

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

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

std :: replace также может использоваться для замены charecter. Вот ссылка ссылки http://www.cplusplus.com/reference/string/string/replace/

Надеюсь, что это поможет.

0

Вы можете использовать подстроку для достижения этой цели

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"