如何在C++中使用转换说明符字符

How to use conversion specifier character in C++?

本文关键字:转换 说明符 字符 C++      更新时间:2023-10-16

在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<<是相当标准的,但许多人出于许多原因(例如:迭代、可读性)反对它。因此,如果您喜欢字符串格式,可以选择。