2012-02-17 4 views
0

char str[]을 매개 변수로 사용하는 함수가 있습니다. 문자열 입력을주는 함수를 호출하고 싶습니다.char 배열을 매개 변수로 사용하는 함수

void someFunction (char str[]) { 
    /* ... */ 
} 

// Works. 
someFunction("1010101"); 

// Does not work. 
string someString; 
someFunction(someString); 

두 번째 전화를 받으려면 어떻게해야합니까?

편집 : 함수의 입력 매개 변수를 변경할 수 없습니다.

+3

someFunction (someString.c_str()); –

+1

@Cody : 컴파일되지 않으며,'c_str()'은 const입니다. –

+0

나는 그 부분을 상상력에 맡기고 있었기 때문에 그것은 단지 주석이었습니다. 'someFunction'도 역시'const'이어야합니다. –

답변

2

당신은 할 수 있어야한다 :

someFunction(const_cast<char*>(someString.c_str())); 

을 내가 str이 수정됩니다 경우 무슨 일이 일어날 지 모르겠습니다 만.

원래 매개 변수를 수정하여 다른 매개 변수 유형을 사용하는 것이 가장 좋습니다.

+0

어느 쪽도 표준이 아닙니다. 그것이 우리가 "정의되지 않은 행동"이라고 부르는 이유입니다. –

+0

이것이 작동하는 것 같습니다. 이걸 사용하는 데 문제가 있습니까? 모든 문자열은 배열에 저장되므로 읽는 중이고 변경되지는 않습니다. – DomX23

+0

@CodyGray 방금 내가 썼다는 것이 확실하지 않기 때문에 문자열을 수정하려고하면 어떻게 될지 잘 모르겠다. – Matthew

0

당신은 당신의 기능을 대신 std::string 걸릴 수 :

void someFunction (std::string &str) { 
+0

다음 오류가 발생합니다. .cpp : 207 : 오류 : 'const char *'에서 'char *'로의 변환이 올바르지 않습니다. .cpp : 207 : 오류 : 'void someFunction (char *)'인수 1 초기화 – DomX23

+1

' const' 그냥 그렇게? 어딘가에, 유아 신성이 울고있다 ... –

+0

'someFunction'이 내용을 수정하려고 시도하면 첫 번째 버전이 위험 할 수있다. – Naveen

3

문자열 조작의 특성에 따라 다릅니다. 문자열을 읽었지만 쓰지 않으면 프로토 타입을 const char str[]으로 변경하고 someString.c_str()을 사용하십시오. 다른 사람들이 제안하는 것과 같습니다.

문자를 변경했지만 길이가이 아닌 경우 &*someString.begin()을 사용하십시오.

문자열을 확장/자르면 string&을 전달하는 것이 쉬우 며 문자열 개체와 관련하여 작동합니다. 솔직히 덜 문제. std::string의 데이터가 연속 메모리 보장되지 않는다 (적어도, C++ 11 전) -

+0

지원 하시겠습니까? "문자를 변경하십시오. & * someString.begin()"을 사용할 수 있습니까? 내 관심사는 표준 라이브러리는 문자열이 불변이거나 어떤 식 으로든 카운트 된 참조를 기대할 수도 있고 내부적으로 일부 애매한 목적을 위해 체크섬을 가질 수도 있다는 것이다. 그래서 SIGSEGV 나 유사한 것을 일으키지 않고 그 메모리를 거의 덮어 쓸 수 있지만, 관련없는 것으로 예상되는 다른 문자열에 변경 사항이 반영되거나 일부 내부 클래스 불변성이 무효화 될 수 있습니다. 그것이 복사되지 않은 새롭게 생성 된'string'이라면 매우 안전 할 것입니다 .... –

+0

과거에 저를 위해 일했습니다 :) 또한이 방법으로 생각해보십시오. begin()은 쓰기 가능한 참조를 반환하는 반복자를 반환합니다. 그 참조에 대한 글을 가로채는 방법은 없기 때문에, 참조는 문자열 뒤에있는 실제 저장소를 가리켜 야합니다. 또한 표준에서는 문자열이 인접한 메모리 블록으로 저장되어야하므로 나머지 문자는 동일한 블록에 있습니다. QED. –

+0

사운드 포인트 re'begin()'- 문자열 someString; someFunction (someString);'질문에서 사용법은 'const'가 아닌 버전을 호출 할 것이고, 구현은 그 이후에 망쳐 버릴 것입니다. –

1

은 당신이 std::string 원하는 것은 문제에 대한 이유가 void someFunction(std::string& str);

입니다. 따라서 연속 버퍼 (char[])로 버퍼를 조작하는 것은 매우 나쁜 생각입니다.

const의 캐스팅을 std::string::c_str()으로 버리는 것은 나쁜 생각입니다. 하나의 즉각적인 문제는 std::string 구현이 다른 std::string 인스턴스 (복사시 복사)와 백업 문자열 할당을 공유 할 수 있으므로 다른 std::string의 값을 수정하게됩니다. 물론, 구현 자체 정의 방식으로 잘못 될 수있는 다른 많은 나쁜 것들이 있습니다. 표준은 이것을 표준 라이브러리의 구현 자에게 매우 유연하게 남겨 둡니다.

EDIT: I cannot change the function's input parameters.

대신 std::vector을 사용하십시오.

관련 문제