2014-09-25 2 views
2
std::string mystring; 

sprintf(mystring.c_str(), "%s %d", "Helloworld", 2014); 

그것의 나에게 컴파일러 오류를주고있다'에서 'const를 숯불 *'에서 매개 변수 1 변환 할 수 없습니다 '의 sprintf는 : 숯불 * '

'sprintf' : cannot convert parameter 1 from 'const char *' to 'char *'

+1

첫 번째 매개 변수는 * 숯불해야하지만 당신은 const를 문자를 전달하고 있습니다. ** mystring.c_str() **은 const char *입니다. sprintf ** mystring.append ("Helloworld 2014"); ** – Gangadhar

+0

"sprintf"의 첫 번째 인수는 형식이 지정된 문자열이있는 문자 배열 'char *'에 대한 포인터입니다 저장되었습니다. 반면, mystring.c_str()은 mystring에서 생성 된 연속 문자 배열입니다. 데이터 유형이 다릅니다. –

답변

9

당신의 경고는 당신에게 당신이 필요로하는 모든 정보를 제공합니다 .

std::string::c_str()const char*이고 sprintf는 버퍼를 수정하므로 char*이 필요합니다.

하지만 C++을 작성 중이므로 sprintf를 피해야합니다. 형식화 된 데이터를 문자열에 쓰려면 ostringstream을 사용하십시오.

+0

그것은'std :: string :: c_str()'입니다. 그리고'std :: stringstream'이 아닌'std :: ostringstream'을 써야합니다. –

+0

@JamesKanze 예. 오타를 수정했습니다. 'stringstream'은 특정 클래스보다 더 많은 개념을 의미했습니다. 그렇지 않으면 나는 backticks를 사용했다 - 그러나 나는 또한 더할 것이다. –

2

std::string은 기본 C 스타일 버퍼를 관리합니다. c_str은 문자열의 메서드 이외의 다른 것으로 수정해서는 안되기 때문에 const char *를 반환합니다.

ostringstream을 사용해야합니다. 이 질문보기 : C++ equivalent of sprintf?

10

오류가 아니어야합니다. 포인터 은 std::string::c_str()에 의해 반환되며 읽기 전용 메모리를 가리 킵니다. 그것을 통해 쓰려고 시도하는 것은 정의되지 않은 동작입니다. (컴파일러를 종료하기 위해 const_cast를 사용하는 경우가 빈 strying에 c_str()를 호출하고 이후 경우, 당신은, 코드는 아마 충돌 것입니다.) 일반적으로 당신은 아마 원하는 것을 말하기

std::ostringstream입니다 :

std::ostringstream formatter; 
formatter << "Helloworld" << ' ' << 2014; 
std::string myString = formatter.str(); 

FWIW : sprintf가 표준 라이브러리에서 가장 위험한 기능 중 하나, 그리고 역사적인 이유로에만 존재합니다. 안전하게 사용하는 것이 거의 불가능한 입니다. 심지어 C에서, 당신은 snprintf을 선호해야합니다 (그러나 C++에서는 std::ostringstream이 훨씬 낫습니다).

+0

아름다운 답변! +1 – user1336087

2

결과를 mystring.c_str()에 저장하도록 sprintf에 명령합니다. 이것은 mystring의 기본 표현의 읽기 전용보기입니다. 읽기 전용이므로 (또는 const char *) 결과를 쓸 수 없습니다.

sprintf를 사용해야하는 경우 쓸 수있는 문자 버퍼를 만든 다음 해당 버퍼를 mystring에 할당해야합니다.

문자 버퍼를 생성 가능한 오버 플로우를 처리 할 필요없이 동작이 정렬을 수행하는 다른 방법은 stringstream 사용하는 것이다 : 또는

std::stringstream buffer; 
buffer << "Helloworld " << 2014; 
mystring = buffer.str(); 
0

를, 그 다음에, 임시 버퍼 C snprintf 오래 사용 문자열에 할당합니다

std::string mystring; 
char buf[64]; 
snprintf(buf, sizeof(buf), "%s %d", "Helloworld", 2014); 
mystring.assign(buf); 

snprintf 항상 안전에 비해 sprintf이다가 buffer overflow을 피할 수 있기 때문이다.

물론 대답 here by James Kanze과 같은 ostringstream을 사용하는 것이 좋습니다.

0
#include <iostream> 
#include <string> 
#include <sstream> 

std::stringstream ss; 
ss << "Helloworld"; 
ss << " "; 
ss << "2014"; 
ss << std::endl; 
std::string str = ss.str(); 
std::cout << str; 

const char * mystring= str.c_str(); 

이렇게하면 문자열에 int 또는 long 숫자를 추가 할 수도 있습니다.

예 : * sprintf와의

long year = 2014; 

std::stringstream ss; 
ss << "Helloworld"; 
ss << " "; 
ss << year; 
ss << std::endl; 
std::string str = ss.str(); 
std::cout << str; 

const char * mystring= str.c_str();