2012-12-19 8 views
1

저는 C++을 처음 사용하고 아직 모든 개념을 아직 파악하지 못했기 때문에이 함수가 작동하지 않는 이유에 당혹 스럽습니다. 현재 집에 없기 때문에 컴파일러 오류를 게시 할 수 없습니다. 집에 도착하자 마자 바로 처리 할 것입니다.상수 문자 포인터를 반환하면 오류가 발생합니다.

여기에 함수가 있습니다.

const char * ConvertToChar(std::string input1, std::string input2) { 
    // Create a string that you want converted 
    std::stringstream ss; 
    // Streams the two strings together 
    ss << input1 << input2; 
    // outputs it into a string 
    std::string msg = ss.str(); 
    //Creating the character the string will go in; be sure it is large enough so you don't overflow the array 
    cont char * cstr[80]; 
    //Copies the string into the char array. Thus allowing it to be used elsewhere. 
    strcpy(cstr, msg.c_str()); 

    return * cstr; 
} 

const char *를 반환하기 위해 두 문자열을 연결하고 변환하도록 만들어졌습니다. 그 이유는 그것을 사용하고자하는 함수는 const char 포인터가 전달되어야하기 때문입니다.

+0

문자열을 훨씬 쉽게 연결할 수 있습니다 :'string1 + string2'. 당신은 전체'stringstream' 물건을 필요로하지 않습니다. –

답변

3

코드는 로컬 (스택) 변수에 대한 포인터를 반환합니다. 호출자가 로컬 변수가 더 이상 존재하지 않는 포인터를 가져올 때. 이것은 종종 매달려 참조라고합니다.

std::string을 C 스타일 문자열로 변환하려면 std::string::c_str()을 사용하십시오.

std::string input1 = ...; 
std::string input2 = ...; 

// concatenate 
std::string s = input1 + input2; 

// get a c-style string 
char const* cstr = s.c_str(); 
// cstr becomes invalid when s is changed or destroyed 
+0

그래서 전역 변수를 반환하는 대신 수정하는 글로벌 char 변수를 만들어야합니까? 또한 로컬 (스택) 변수가 의미하는 바를 자세히 설명 할 수 있습니다. – Dibesjr

+0

그래서 내가 어떻게 파괴되는 것을 피하겠습니까? – Dibesjr

+0

@Dibesjr 연결 예를 추가했습니다. –

1

오류가 무엇인지 모른 채, 그 말을 열심히하지만,이 행 :

그래서, 두 개의 문자열을 연결하고 C 스타일 문자열을 얻으려면 어떻게

const char* cstr[80]; 

잘못된 것 같습니다 : 80 포인터의 배열을 만듭니다; 이 암시 적으로 포인터로 변환되면 형식은 인수가 strcpy으로 전달 될 때 오류가 발생하고 문을 역 참조하는 것은 cstr[0]을 작성한 경우와 동일하며 오류를 반환해야하는 형식이 char const**이됩니다 어레이 배열의 내용이 초기화 된 적이 없기 때문에 배열 —의 첫 번째 포인터는 정의되지 않은 동작입니다. 당신은 더 이상 갈 전에

, 당신은 기능 이 —의 유형뿐만 아니라 반환해야합니다을 정의해야하지만, 메모리에 뾰족한 어디있는 것입니다.

버퍼에 대한 로컬 정적 사용 :가 세 가지 해결책이한다이 용액 자주 초기 C에서 사용 하였다
및 C 라이브러리 함수들이 여전히 존재 . 두 가지 주요 결함이 있습니다. 1) 연속 호출은 결과를 겹쳐 쓰므로 클라이언트 코드 은 함수를 다시 호출하기 전에 자체 사본을 작성해야하며 2) 스레드 안전하지 않습니다. (두 번째 문제는 스레드 로컬 저장소 스레드를 사용하여 피할 수 있습니다.) 자신의 경우에는 버퍼가 데이터에 충분한 크기 여야합니다. 에는 아마도 동적 할당이 필요하므로 복잡도가 이됩니다 .
포인터를 반환
동적 메모리 할당하기 :
이 잘 이론적으로 작동하지만 메모리를 해제하기 위해 클라이언트 코드를 필요로합니다. 이것은 엄격하게 문서화되어야하며 은 오류가 발생하기 쉽습니다.
버퍼를 제공하기 위해 클라이언트 코드를 필요 :
이 현대적인 코드의 가장 좋은 방법은 아마이지만 당신이 주소와 버퍼의 길이에 대한 추가 매개 변수가 필요하다는 의미한다. 이 외에도

: 당신이하고있는 모든 합치 경우 std::ostringstream 를 사용할 필요가 없습니다; 두 문자열을 추가하기 만하면됩니다. 사용하는 솔루션에 관계없이 결과가 맞는지 확인하십시오.

+0

자세한 설명 주셔서 감사합니다! 매일 새로운 것을 배우십시오! C++은 제가 다루어야 할 가장 어려운 언어입니다. 대부분의 다른 언어는 할 수있는 것과 할 수없는 것에 관해 아주 명확한 컷 규칙을 가지고 있습니다. 이것은 나와 같은 초보자들에게 C++에 대한 모든 규칙과 뉘앙스로 인해 C++을 탐구하는 것을 어렵게 만듭니다. – Dibesjr

관련 문제