2016-10-05 2 views
2

현재 C++을 배우고 있으며 sprintf를 사용하는 등 알 수없는 문자열 길이와 같은 여러 매개 변수를 사용하는 포맷터로 문자열을 만드는 방법을 찾을 수 없습니다.알 수없는 길이의 문자열 서식 지정 C++

내가 뭘 원하는 것은

내가 C 알고
string myString = string.format("Hello, here is %s %s and another %s", par1, par2, par3); 

같은 그것이 문자열이 될 것입니다 얼마나 밖으로 작동하는 asprintf 기능이이며 메모리의 malloc을 마치면 당신은 그것을 확보해야 그러나 sprintf가 있지만 C++에서는 사용할 수없는 것 같습니다. asprintf에 대해 Google에서 본 모든 내용은 주로 Linux에 초점을 맞추는 것처럼 보입니다. 반면 크로스 플랫폼이 필요합니다.

내가 C++ 및 문자열 형식화에 대해 본 모든 것은 고정 길이의 char 배열을 정의하고 sprintf를 사용해야하지만이 작업을 수행 할 수 없도록 문자열의 길이를 알지는 못합니다.

도움을 주셔서 감사합니다.

+1

부스트에는 이와 비슷한 것이 있지만 표준 C++에는 없습니다. 그러나 문자열 ('std :: string' 즉, 이전 문자열 리터럴이 아닌)을'operator +'로 연결할 수 있습니다. –

+2

이제'<< "연산자를 만나야합니다. 임의의 크기와 매개 변수의 문자열을 형식화하는 데 사용되는 것은'<<'입니다. –

+1

'std :: ostringstream'을 사용하십시오. – Leon

답변

1

Josuttis의 The Standard C++ Library를 다운로드하십시오. 그것은 완전한 문자열 인터페이스와 훨씬 더 많은 것을 제공 할 것입니다. 당신은 C++가 아닌 C를 생각하는 것 같습니다. 물론 sprintf()와 같은 C 인터페이스를 사용하여 char []을로드 한 다음 C++ 문자열에 복사 할 수 있습니다. 그것은 대개 나쁜 생각입니다.

Two ways to do what you ask: 
string myString("Hello, here is "); 
myString += par1; 
myString += " "; 
myString += par2; 
myString += " and another "; 
myString += par3; 

stringstream foo; 
foo << "Hello, here is " << par1 << " " << par2 << " and another " << par3; 
string myString(foo.str()); 
+0

고마워요. 가끔씩 C와 C++가 섞여있는 것 같아요. 나는 stringstream에 갔다. – Boardy

1

기존의 우수한 대답 외에도 Boost Format 라이브러리를 고려해 볼 수 있습니다.

예 :

std::string myString = str(boost::format("Hello, here is %s %s an another %s") % par1 % par2 % par3); 
1

는 답변을 많이가 있습니다. C++ 문자열이 매우 길어 지므로 std :: stringstream을 사용하여 문자열을 작성하려고합니다. 이렇게하면 메모리에있는 파일 인 것처럼 문자열에 쓸 수 있으며 매우 큰 문자열을 효율적으로 처리하기 위해 작성됩니다. C 함수 snprintf()는 널 포인터가 전달되면 작성한 문자 수를 반환합니다. 따라서 두 번 호출해야합니다. 한 번 크기를 얻은 다음 버퍼를 할당하고 다시 포맷해야합니다. 이것은 매우 짧고 정의 된 형식으로 예상되지만 임의로 길어질 수있는 문자열 (예 : 누군가의 이름이 들어있는 문자열)에 좋은 솔루션입니다.

printf() 형식은 정수, 문자열 및 실수의 기본 출력에 편리하고 사용하기 쉽지만 toString() 메서드를 작성할 수있는 방법이 없기 때문에 사용자 정의 개체까지 확장되지 않습니다. 메서드를 호출하고 호출 후 문자열을 삭제합니다. 또한 객체 배열도 처리 할 수 ​​없습니다. 오버로딩 < <은 객체의 텍스트 표현을 스트림에 씁니다.