我有一个 sprintf 命令,由于 aurgument 变量中的 %s 而崩溃。除了用 %% 转义参数字符串之外,建议的解决方法是什么。
char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);
任何帮助将不胜感激。
我有一个 sprintf 命令,由于 aurgument 变量中的 %s 而崩溃。除了用 %% 转义参数字符串之外,建议的解决方法是什么。
char* s="abc%sabc";
char a[100];
sprintf(a,"The message is : %s",s);
任何帮助将不胜感激。
我只会留在 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()
.
你的例子对我有用:http: //ideone.com/ZnsiZZ。
只需使用std::string
:
#include <string> // for std::string
std::string s = "abc%sabc";
std::string a = "The message is : " + s;
或者,如果您需要连接其他类型,例如整数:
#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"
不要printf
用于打印任意字符串。使用puts
或格式化字符串:
char const *evil;
// Bad:
printf(evil);
// Good:
puts(evil);
fputs(evil, stdout);
// Acceptable:
printf("%s", evil);
请注意,“坏”版本不仅在理论上在某些陈旧的计算机科学方面很糟糕,而且由于类似%n
格式处理,它实际上可以立即被利用来执行任意代码和泄露数据。
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
is "The message is : abc%sabc"
。作为 的格式,printf()
该函数需要另一个参数,因为%s
in a
- 未给出并且未定义行为 (UB) 结果。
相反,OP应该改为
printf("%s", a);
// or
puts(a);
使用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
希望有帮助。