sprintf因参数变量中的%s而崩溃

时间:2013-09-23 06:03:51

标签: c++ c printf format-specifiers

我有一个sprintf命令,由于aurgument变量中的%s而崩溃。除了使用%%转义aurgument字符串之外,建议的解决方法是什么。

char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);

任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:2)

不要使用printf打印任意字符串。使用puts或格式化字符串:

char const *evil;

// Bad:
printf(evil);

// Good:
puts(evil);
fputs(evil, stdout);

// Acceptable:
printf("%s", evil);

请注意,“坏”版本在理论上不仅仅是一些愚蠢的计算机技术方式,但它实际上可以立即利用来执行任意代码和exfiltrate数据,这要归功于%n - 就像格式处理一样。 / p>

答案 1 :(得分:2)

您的示例适用于我:http://ideone.com/ZnsiZZ

只需使用std::string

#include <string>  // for std::string

std::string s = "abc%sabc";
std::string a = "The message is : " + s;

或者如果你需要连接其他类型,如intergers:

#include <string>  // for std::string
#include <sstream> // for std::stringstream

std::string s = "abc%sabc";
int i = 42;
std::stringstream sstr( "The message is : " );
sstr << s << "" << i;
std::string a = sstr.str(); // a = "The message is : abc%abc 42"

答案 2 :(得分:2)

我只会留在C域(不使用C ++)。

对我来说,此代码不会崩溃并打印abc%abc

#include <stdio.h>
int main() {
    char* s="abc\%sabc";
    printf("The message is: %s\n", s);
}

但是此代码打印abcabc(没有%),有时会崩溃:

#include <stdio.h>
int main() {
    char* s="abc\%sabc";
    char a[100];
    sprintf(a, "The message is: %s\n", s);
    printf(a);      // <-- %s is interpolated in printf!
}

这里的问题很可能是你尝试使用sprintf打印由printf创建的字符串 - 这会进行第二次插值并导致所有麻烦。

解决方案始终使用puts()来打印由sprintf()创建的字符串。

答案 3 :(得分:1)

使用std::string,问题就出现了:

#include <sstream> //include this

std::string s = "abc%sabc";
std::string a = "The message is : " + s;

如果您想使用int之类的非字符串值,那么std::stringstream会对您有所帮助:

int s = 100; //s is int now!
std::stringstream ss("The message is : ");
ss << s;
std::string a = ss.str(); //a is => The message is : 100

希望有所帮助。

答案 4 :(得分:1)

OP可能会使用printf(a)来打印任意字符串a

char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);
// My guess is that OP follows with
printf(a);  // This causes the error.

此操作失败,因为a"The message is : abc%sabc"。作为printf()格式,该函数需要另一个参数,因为%s中的a - 未给出和未定义的行为(UB)结果。< / p>

相反OP应该

printf("%s", a);
// or
puts(a);