std::string mystring;
sprintf(mystring.c_str(), "%s %d", "Helloworld", 2014);
그것의 나에게 컴파일러 오류를주고있다'에서 'const를 숯불 *'에서 매개 변수 1 변환 할 수 없습니다 '의 sprintf는 : 숯불 * '
'sprintf' : cannot convert parameter 1 from 'const char *' to 'char *'
std::string mystring;
sprintf(mystring.c_str(), "%s %d", "Helloworld", 2014);
그것의 나에게 컴파일러 오류를주고있다'에서 'const를 숯불 *'에서 매개 변수 1 변환 할 수 없습니다 '의 sprintf는 : 숯불 * '
'sprintf' : cannot convert parameter 1 from 'const char *' to 'char *'
당신의 경고는 당신에게 당신이 필요로하는 모든 정보를 제공합니다 .
std::string::c_str()
은 const char*
이고 sprintf는 버퍼를 수정하므로 char*
이 필요합니다.
하지만 C++을 작성 중이므로 sprintf를 피해야합니다. 형식화 된 데이터를 문자열에 쓰려면 ostringstream
을 사용하십시오.
그것은'std :: string :: c_str()'입니다. 그리고'std :: stringstream'이 아닌'std :: ostringstream'을 써야합니다. –
@JamesKanze 예. 오타를 수정했습니다. 'stringstream'은 특정 클래스보다 더 많은 개념을 의미했습니다. 그렇지 않으면 나는 backticks를 사용했다 - 그러나 나는 또한 더할 것이다. –
std::string
은 기본 C 스타일 버퍼를 관리합니다. c_str
은 문자열의 메서드 이외의 다른 것으로 수정해서는 안되기 때문에 const char *를 반환합니다.
ostringstream
을 사용해야합니다. 이 질문보기 : C++ equivalent of sprintf?
오류가 아니어야합니다. 포인터 은 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
이 훨씬 낫습니다).
아름다운 답변! +1 – user1336087
결과를 mystring.c_str()
에 저장하도록 sprintf에 명령합니다. 이것은 mystring
의 기본 표현의 읽기 전용보기입니다. 읽기 전용이므로 (또는 const char *
) 결과를 쓸 수 없습니다.
sprintf를 사용해야하는 경우 쓸 수있는 문자 버퍼를 만든 다음 해당 버퍼를 mystring에 할당해야합니다.
문자 버퍼를 생성 가능한 오버 플로우를 처리 할 필요없이 동작이 정렬을 수행하는 다른 방법은 stringstream
사용하는 것이다 : 또는
std::stringstream buffer;
buffer << "Helloworld " << 2014;
mystring = buffer.str();
를, 그 다음에, 임시 버퍼 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
을 사용하는 것이 좋습니다.
#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();
첫 번째 매개 변수는 * 숯불해야하지만 당신은 const를 문자를 전달하고 있습니다. ** mystring.c_str() **은 const char *입니다. sprintf ** mystring.append ("Helloworld 2014"); ** – Gangadhar
"sprintf"의 첫 번째 인수는 형식이 지정된 문자열이있는 문자 배열 'char *'에 대한 포인터입니다 저장되었습니다. 반면, mystring.c_str()은 mystring에서 생성 된 연속 문자 배열입니다. 데이터 유형이 다릅니다. –