printf
C 의미 1 에서 변수 인수를 사용 하기 때문에 형식이 안전하지 않기 때문에 컴파일 중 입니다. printf
에 대한 옵션이 없으며 std::string
C 스타일 문자열 만 있습니다. 예상 한 것 대신 다른 것을 사용하면 원하는 결과를 얻지 못할 것입니다. 실제로 정의되지 않은 동작이므로 모든 일이 발생할 수 있습니다.
가장 쉬운 방법은 C를 사용하고 있기 때문에 ++, 정상적으로를 인쇄하고,이 문제를 해결하기 std::cout
때문에, std::string
를 통해 운영자가 오버로드 것을 지원 :
std::cout << "Follow this command: " << myString;
어떤 이유로, 당신은 C 스타일의 문자열을 추출해야하는 경우 사용할 수있는 c_str()
방법 std::string
의 GET에 const char *
null로 끝나는입니다를. 귀하의 예를 사용하여 :
#include <iostream>
#include <string>
#include <stdio.h>
int main()
{
using namespace std;
string myString = "Press ENTER to quit program!";
cout << "Come up and C++ me some time." << endl;
printf("Follow this command: %s", myString.c_str()); //note the use of c_str
cin.get();
return 0;
}
printf
안전하지만 형식이 안전한 함수를 원한다면 variadic 템플릿 (C ++ 11, MSVC12부터 모든 주요 컴파일러에서 지원됨)을 살펴보십시오. 여기 에서 하나의 예를 찾을 수 있습니다 . 표준 라이브러리에는 구현 된 것과 같은 것이 없지만 Boost에는 특히 boost::format
있습니다.
[1] : 이는 여러 개의 인수를 전달할 수 있지만 함수는 해당 인수의 수와 유형을 알려줍니다. 의 경우 이는 의미 printf
와 같은 인코딩 된 유형 정보가있는 문자열을 %d
의미 int
합니다. 유형이나 숫자에 대해 거짓말을하면 함수에 표준적인 방법이 없지만 일부 컴파일러는 거짓말을 할 때 경고를 확인하고 경고 할 수 있습니다.