그 알 std::cout
의 동등한 C ++입니다 printf
.
C ++에 해당하는 것은 무엇입니까 sprintf
?
그 알 std::cout
의 동등한 C ++입니다 printf
.
C ++에 해당하는 것은 무엇입니까 sprintf
?
답변:
예:
#include <iostream>
#include <sstream> // for ostringstream
#include <string>
int main()
{
std::string name = "nemo";
int age = 1000;
std::ostringstream out;
out << "name: " << name << ", age: " << age;
std::cout << out.str() << '\n';
return 0;
}
산출:
name: nemo, age: 1000
sprintf (...)
합니까? 데이터를 임의로 형식화 할 수 없으며 <<
연산자를 사용하여 스트림에 데이터를 공급할 때 알려진 유형에 의존해야합니다 .
2019 년 8 월 업데이트 :
C ++ 20에 std::format
. 참조 구현은 {fmt} 입니다. printf()
지금 대안을 찾고 있다면 이것은 새로운 "표준"접근 방식이 될 것이며 고려할 가치가 있습니다.
실물:
Boost.Format을 사용하십시오 . 그것은 printf
구문, 형식 안전성, std::string
결과 및 기타 멋진 것들을 많이 가지고 있습니다. 당신은 돌아 가지 않을 것입니다.
sprintf 는 C ++에서 잘 작동합니다.
다음은 C ++ sprintf를위한 멋진 함수입니다. 스트림을 너무 많이 사용하면 스트림이 추악해질 수 있습니다.
std::string string_format(const std::string &fmt, ...) {
int size=100;
std::string str;
va_list ap;
while (1) {
str.resize(size);
va_start(ap, fmt);
int n = vsnprintf(&str[0], size, fmt.c_str(), ap);
va_end(ap);
if (n > -1 && n < size) {
str.resize(n); // Make sure there are no trailing zero char
return str;
}
if (n > -1)
size = n + 1;
else
size *= 2;
}
}
C ++ 11 이상에서, 표준 : : 문자열은 연속 스토리지를 사용하도록 보장 그게 끝 '\0'
이로 캐스팅 할 법적, 그래서 char *
사용 &str[0]
.
가변 인수는 참조에 의한 전달을 따르지 않아야하며 C ++는 필요하지 않은 경우 문자열을 복사하지 않는 것이 좋습니다. 이 경우 수정됩니다.
std::string string_format(std::string fmt, ...) {
sprintf
.
(char*) str.c_str()
캐스트 버림 const
.
정확히 무엇을 계획하는지에 따라 다른 옵션보다 유용하고 관용적 sprintf()
일 std::to_string()
수 있습니다.
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
std::to_string()
IMHO 의 가장 큰 장점은 문자열 sprintf()
화를 꿈도 꾸지 못하는 추가 유형을 지원하도록 쉽게 확장 할 수 있다는 것입니다 Object.toString()
.