Tôi biết đó std::cout
là C ++ tương đương với printf
.
C ++ tương đương là sprintf
gì?
Tôi biết đó std::cout
là C ++ tương đương với printf
.
C ++ tương đương là sprintf
gì?
Câu trả lời:
Thí dụ:
#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;
}
Đầu ra:
name: nemo, age: 1000
sprintf (...)
? Bạn không thể định dạng dữ liệu một cách tùy tiện, bạn phải dựa vào kiểu được biết khi bạn đưa nó vào luồng bằng <<
toán tử.
Cập nhật, tháng 8 năm 2019:
Có vẻ như C ++ 20 sẽ có std::format
. Triển khai tham chiếu là {fmt} . Nếu printf()
bây giờ bạn đang tìm kiếm một giải pháp thay thế thì đây sẽ trở thành cách tiếp cận “tiêu chuẩn” mới và rất đáng xem xét.
Nguyên:
Sử dụng Boost.Format . Nó có printf
cú pháp giống, kiểu an toàn, std::string
kết quả và rất nhiều thứ tiện lợi khác. Bạn sẽ không quay trở lại.
sprintf hoạt động tốt trong C ++.
Bạn có thể sử dụng tệp tiêu đề iomanip để định dạng luồng đầu ra. Kiểm tra này !
Đây là một chức năng hay cho c ++ sprintf. Các luồng có thể trở nên xấu đi nếu bạn sử dụng chúng quá nhiều.
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;
}
}
Trong C ++ 11 trở lên, std :: string được đảm bảo sử dụng bộ nhớ liền kề có kết thúc bằng '\0'
, vì vậy việc truyền nó để char *
sử dụng là hợp pháp &str[0]
.
Nó đã được chỉ ra rằng các đối số khác nhau không được cho là tuân theo tham chiếu truyền và c ++ tốt về việc không sao chép các chuỗi nếu nó không cần thiết. Trong trường hợp đó, điều này sẽ sửa chữa nó.
std::string string_format(std::string fmt, ...) {
sprintf
-usage.
(char*) str.c_str()
bỏ đi const
.
Tùy thuộc vào chính xác những gì bạn định nhập sprintf()
, std::to_string()
có thể hữu ích và dễ thành ngữ hơn các tùy chọn khác:
void say(const std::string& message) {
// ...
}
int main() {
say(std::to_string(5));
say("Which is to say " + std::to_string(5) + " words");
}
Ưu điểm chính của std::to_string()
IMHO là nó có thể được mở rộng dễ dàng để hỗ trợ các kiểu bổ sung mà sprintf()
bạn thậm chí không thể mơ đến việc xâu chuỗi - giống như Object.toString()
phương pháp của Java .