2012-02-16 3 views
3

string을 (를) char * (으)로 변환하는 방법 다음 방법을 사용했지만 작동하지 않습니다.C + +에서 char *로 문자열을 변환하는 방법?

Run-Time Check Failure #3 - The variable 'url' is being used without being initialized.

코드를 넣고 같이 내가 그것을 초기화 만 가지고 있지만 : 런타임시

그것은 나에게 다음과 같은 오류를 제공합니다. 예를 보여 주시겠습니까? 나는 마이크로 소프트 비주얼 스튜디오 2010을 사용하고

char* url; 
    sup = "news" 
    sup="http://www."+sup+"yahoo.com"; 
    strcpy(url, sup.c_str()); 

, 콘솔에서 C++

+0

단순히 문자 포인터를 사용하려면 'url'변수에 동일한 바이트 수를 다시 할당하는 대신 sup.c_str()을 사용하면됩니다. – PermanentGuest

+0

@Unni 그것은 const char * 일뿐입니다 (char *뿐만 아니라). 그러나 실제로 필요한 것이 무엇인지 동의합니다. – adelphus

+1

레거시 시스템에 전달할 때까지 모든 곳에서'std :: string'을 사용합니다. 그런 다음'std :: string :: c_str()'을 사용하십시오. 'std :: string'을 사용할 수없는 이유가 있습니까? –

답변

5

strcpy 당신은 널 종료 문자를위한 공간을 떠나 기억, 스스로를 수행해야합니다, 당신을 위해 메모리를 할당하지 않습니다

char* url = new char[sup.length()+1]; 

또는 첫 번째 경우에

char url[sup.length()+1]; 
//... 
strcpy(url, sup.c_str()); 

는하는 것을 잊지 마세요배열입니다. 두 번째 경우는 컴파일러가 C99 가변 길이 배열을 확장으로 지원하는 경우에만 작동합니다.

+0

고마워. 그것은 지금 잘 작동 –

+1

그것은 잘 작동하지만 이것은 제 의견으로는 최선의 대답이 아닙니다. 당신은 항상 다른 사람들의 말을 기다리지 않고 작동하는 첫 번째 대답을 받아들이려고 갑자기 서둘 렀습니까? 이 대답을 좋아하지 않는 이유는 C++에서 new to 및 raw 배열을 사용하지 않아야하지만 vector를 사용하는 것이 좋습니다. boost :: shared_array 은 정말로 새로운 것을 사용해야하는 경우 다른 옵션이 될 것입니다. 두 번째 몸체는 특별히 좋아하지 않지만 임의의 크기를 골라 내고 어떤 검사도하지 않고도 적합하기를 바랍니다. 사실 나는 왜 첫번째 블록을 위해서 32가 선택되었는지 모른다. – CashCow

+0

@CashCow 아뇨. 대답은 주어진 좋은 연습과 표준 연습입니다. 부스트 또는 벡터 사용에 대한 답은 직관력이없고 (IMO) 지저분합니다. – adelphus

1
char* url = new char[100]; 

먼저 문자 배열에 메모리를 할당해야합니다.

0

sup에서 url으로 복사한다고해서 url이 초기화되지는 않습니다.
초기화 url은 메모리 할당을 의미합니다. 이와 같이 :

url = new char[size]; 
2

strcpy은 버퍼 오버 플로우가 발생할 수 있으므로 안전하지 않습니다. 복사 할 정확한 바이트 수를 제공하는 strncpy을 사용하십시오. 당신은 \0 후행 대상 버퍼 메모리를 할당하고 추가해야합니다, 당신이 사용할 수있는

std::string strInsert("news"); 
std::string sup("http://www."); 
sup += strInsert + "yahoo.com"; 

char* url = new char[sup.length() + 1]; 
strncpy(url, sup.c_str(), sup.length()); 
url[sup.length()] = '\0'; 
// ... use url 
delete[] url; 
1

당신이 정말 표준의 내용에서 복사되는 문자 : 문자열의 쓰기 가능한 버퍼가 필요한 경우 std::vector<char>

std::vector<char> urlAsVec(sup.c_str(), sup.c_str() + sup.size() + 1); 

너무 당신을 위해 널 (NULL) 종료를 작성합니다 :

std::vector<char> urlAsVec(sup.begin(), sup.end()); 
urlAsVec.push_back('\0'); 
char * url = &urlAsVec[0]; // pointer you can safely write to 

는 또한 벡터 이런 식으로 초기화 할 수 있습니다.

또 다른 방법 : 당신의 벡터가 자동으로 그렇게 null 종결은() sup.copy 그것을 기록하지 않는 경우에도이있을 것이다 0 모든 요소를 ​​초기화합니다

std::vector<char> urlAsVec(sup.size() + 1); 
sup.copy(&urlAsVec[0], sup.size()); 

참고. 어쨌든 strcpy 대신 sup.copy(ptr, len)을 사용할 수 있습니다. 버퍼 크기 (strncpy도 허용하지만)를 지정할 수 있다는 점에서 약간 안전합니다.하지만 수동으로 널 종결자를 작성해야하거나 이미 할당해야합니다.당신이 당신의 버퍼에 기록 소스 문자열의 사본 또는 부분 사본을 얻을 것이다 BUFLEN 몇 가지 고정 된 값을

char url[ BUFLEN ] = {0}; 
sup.copy(url, BUFLEN-1); 

:

는 예를 들어, 당신은이를 사용하는 경우. 내 이니셜이 기록되지 않은 바이트 0

0
std::string sup = "news"; 
sup="http://www."+sup+"yahoo.com"; 
char* url = new char[sup.length()+1]; 
url = const_cast<char*>(sup.c_str()); 
url[sup.length()] = '\0'; 

std::cout<<url;   //http://www.newsyahoo.com 

공지 사항 URL의 끝에 '\0' 모든 보장합니다.

3

제 생각에는 이것을 수행하는 두 가지 방법이 있습니다.

  1. string s = "hello"; 
    const char *p; 
    p = s.c_str(); 
    

내가 모두를 테스트 한 둘 다 작업 (앰퍼샌드)

string str = "hello"; 
char *p; 
p = &str[0]; 
  • 사용 c_str() 함수 & - 연산자를 사용하여 . 내가 틀렸다면 친절하게 정정하십시오.

  • +0

    테스트 할 때 작동하지만 첫 번째 테스트는 작동하지 않을 수도 있습니다. 예 :문자열의 내부 표현이 단일 메모리 블록 대신 청크 목록 인 경우이를 시도 할 때 전체 문자열을 가져 오지 못합니다. 따라서 c_str()은 문자열이 메모리의 단일 블록을 만들고 강제로 종료하도록합니다. – Bryan

    +0

    이것이 최고의 솔루션입니다. –

    관련 문제