我有一个sprintf命令,由于aurgument变量中的%s而崩溃。除了使用%%转义aurgument字符串之外,建议的解决方法是什么。
char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);
任何帮助将不胜感激。
答案 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);