2

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

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

任何帮助将不胜感激。

4

5 回答 5

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().

于 2013-09-23T07:29:38.863 回答
2

你的例子对我有用: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"
于 2013-09-23T06:13:11.360 回答
2

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

char const *evil;

// Bad:
printf(evil);

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

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

请注意,“坏”版本不仅在理论上在某些陈旧的计算机科学方面很糟糕,而且由于类似%n格式处理,它实际上可以立即被利用来执行任意代码和泄露数据。

于 2013-09-23T06:11:47.657 回答
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.

这失败了,因为ais "The message is : abc%sabc"。作为 的格式printf()该函数需要另一个参数,因为%sin a- 未给出并且未定义行为 (UB) 结果。

相反,OP应该改为

printf("%s", a);
// or
puts(a);
于 2013-09-23T06:50:57.397 回答
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

希望有帮助。

于 2013-09-23T06:09:51.530 回答