从 printf 中删除格式说明符

Remove format specifiers from printf


我想用printf输出一段文字。

如果我想打印用户先前输入的文本并且可能包含 %,输出是乱码。 这可能是由于 % 是 printf 中的格式说明符,但没有给出 value/argument。

例如:

std::string inputString = "% Test";
printf(inputString.c_str());

Output:  6.698271e-308st

期望的输出是:% Test

有什么优雅的方法可以避免这种情况吗? 输入 %% 而不是 % 是可行的,但显然不是很人性化。

我看到的唯一其他方法是修改输入字符串以自动将每个 % 替换为 %%。但这是要走的路吗? 我是专门want/need使用printf,使用cout是不可能的

prints 始终将格式字符串作为第一个参数。你无法改变这一点。 但是,您可以使用它来指定它应该按原样打印作为第二个参数传递的字符串。

std::string inputString = "% Test";
printf("%s", inputString.c_str());

请注意,虽然对于可以作为格式字符串传递的字符数组没有限制,但您不应使用用户提供的字符串,即使您不希望其中包含任何有趣的字符。 它创建了一个可利用的漏洞。

通常,最好使用字符串文字。如果您传递的参数类型不正确,它允许编译器警告您。 (编译器不必检查,但他们经常这样做。)


也许我应该提到 printf 是一个 C 函数。 虽然在 C++ 程序中使用它完全没问题,但您可以考虑从 header <iostream> 切换到 C++ 风格的流。 它们各有利弊,但我认为在您的情况下它们会更易于使用,尤其是它们支持 std::string.

#include <iostream>
#include <string>

int main(){
    std::string inputString = "% Test";
    std::cout << inputString;
}

要么你用这个:

printf("%s", string.c_str());

或者您使用根本不进行格式化的那个:

puts(string.c_str());

请注意,puts 总是添加换行符!

编辑:添加 c_str 以免与实际问题混淆。

printf,当与 %s 格式说明符一起使用时,需要一个指向 char 的指针。您可以通过 c_str() 方法从 std::string 获取:

std::string inputString = "% Test";
printf("%s", inputString.c_str());