如何在C++中使用转换说明符字符
How to use conversion specifier character in C++?
在Python中,我可以做到这一点:
print("Hello, %s!" % username)
我在C++中如何做类似的事情?我可以这样做,但这可能不是一个好的做法:
void welcome_message(std::string username) {
std::cout << "Hello, " << username << "!" <<std::endl;
}
对于简单的代码,可以使用std::cout
。但这对本地化不是很好,而且看起来有点难看。
Boost.Format通过提供与您在问题中演示的旧Python 2字符串格式化功能(已被str.format()
取代)非常相似的功能来修复此问题。它有点像C的printf
,只是安全。
这里有一个例子:
#include <string>
#include <iostream>
#include <boost/format.hpp>
void welcome_message(const std::string& username)
{
std::cout << boost::format("Hello, %s!n") % username;
}
int main()
{
welcome_message("Jim");
}
(现场演示)
void welcome_message(const std::string& username) {
std::cout << "Hello, " << username << "!" <<std::endl;
}
在C++中是一件非常的好事,除非您正在做一些对性能特别关键的事情。依靠严重过载的<<
来代替std::ostream
是一种很好的实践。这就是它的目的。
注意,我已经更改了函数原型,以避免不必要的字符串复制。printf
方法充满了危险的角落情况:您需要使格式化程序完全正确,否则您的程序的行为将面临未定义的风险。
我唯一可以批评的是你使用std::endl
。请改用"!n"
。
您可以始终使用C的printf:
#include <cstdio>
void welcome_message(const std::string &username) {
printf("Hello, %sn", username.c_str());
}
不过,请注意,必须使用c_str()
将username
转换为C字符串。
如前所述,使用cout
和<<
是相当标准的,但许多人出于许多原因(例如:迭代、可读性)反对它。因此,如果您喜欢字符串格式,可以选择。
相关文章:
- 激励'inline'说明符的真实世界示例?
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 为什么转换函数声明不需要至少一个定义类型说明符
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- put_time具有转换说明符,该转换指定符,该指定符在一个月的单个数字上输出没有前面字符的单位天数
- Clang和GCC在转换C++17中非类型模板参数的自动说明符中存在分歧
- 如何在C++中使用转换说明符字符
- C++标准库是否有用于 printf 转换说明符的模板化 getter
- 双自动转换函数定义,gcc 错误:错误:预期的类型说明符
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 为什么参数与printf未定义行为中的转换说明符不匹配
- 为什么构造函数上的显式说明符不能防止向上转换?