2013-08-19 3 views
7

이 같은 특정 인덱스에서 C++ 문자열을 변경할에서 문자열을 변경하는 가장 좋은 방법 :C++, 특정 인덱스

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

다음 코드는 유효합니까? 이 방법을 사용할 수 있습니까?

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

"문자열에 과부하 [] 연산자"를 통해 우리가 쓰기 작업을 수행 할 수 있다고 말한다 :

나는 그것이 유효 말한다 모든 참조를 찾을 수 없습니다.

+0

달성하기 위해 문자열을 사용할 수있는 예, 전혀 문제. C++ 11 표준의 섹션 21.4.5/2 절을 참조하십시오. –

+5

어. 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

예. 링크 한 웹 사이트에 대한 페이지가 있습니다. 범위 검사를 수행하는 at 함수를 사용할 수도 있습니다.

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

+1

@Potatoswatter 이유는 무엇입니까? 요점은 프로그래머가 범위 검사를 사용할 수 있다는 것이 었습니다. –

+0

@NeilKirk : 모든 사람들이 경계 검사가 끝났으며'at()'에 대해서 알지 못했기 때문에 그것이 변하고 있다고 상상해 봅니다. – cHao

+2

@Potatos 수표에 대한 수표는 무엇입니까? 함수가 유효한 위치 (* 1 * 널 종료자를 설명)로 호출되었거나 동작이 정의되지 않았습니다. Requires 절을 참조하십시오. –

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"