C/C++格式化字符串的一个小坑

格式化字符串是个写C/C++代码是很常见的东西,例如下面这段用了printf的简单代码:

#include <string>

int main()
{
    std::string test = "hello world!";
	printf("%s", test.c_str());
    return 0;
}

虽然看起来有点怪,混用了C++的string和C的printf输出,其实换成char *也是可以的,不过,这并不重要,重要的是我有时会偷懒把上面这段代码写成这样:

#include <string>

int main()
{
    std::string test = "hello world!";
	printf(test.c_str());
    return 0;
}

这样写,看起来似乎输出没有问题,两份代码的结果都是输出”hello world!”,并没有什么区别,那标题说的坑到底在哪呢?考虑这种情况,我们的test字符串里放的不再是简单的 hello world! 了,而是比如转义过的URL串,如“http://www.baidu.com/测试”会被转义成“http%3A%2F%2Fwww.baidu.com%2F%E6%B5%8B%E8%AF%95”,此时如果再用偷懒的写法,直接printf这个字符串,显而易见的就会出问题了!

原因很明显,字符串因为URL编码出现了类似格式化字符串的东西,此时实测如果字符串很长,还带这些无意义的格式化字符串参数的话,程序执行时就有可能发生崩溃等奇怪的问题,所以,还是应该别嫌麻烦,多用保平安的方式:

printf(“%s”, test.c_str());

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。