c - sprintf 使用函数作为参数
问题描述
我坚持从 const char* 的 ac 函数调用和 sprintf 函数中获取一个简单的字符串,该函数有 10 次调用与格式参数相同的函数。但是 sprintf 在调用函数 u 时总是给出最后一个相同的参数值,即:“MM”
main()
{
char test[1000];
int x=sprintf(test,"%s %s",u(17,0),u(18,1));
printf(test);
}
const char *u(int a,int b)
{
static char retStr[700];
static char retStr1[700];
const char *c;
char *d[]={"S","M","T","W","F"};
if(b==0) c="red";
if(b==1) c="blue";
if(a==17 && b==0) {
sprintf(retStr1,"<font color=%s>%s</font>",c,d[0]);
strcpy(retStr,retStr1);
return retStr;
}
if(a==18 && b==1) {
sprintf(retStr1,"<font color=%s>%s</font>",c,d[1]);
strcpy(retStr,retStr1);
return retStr;
}
return "";
}
解决方案
您对函数的两次调用使用相同的缓冲区。
你这样做:
- u(17,0) -> 准备 retStr,返回这个静态变量
- u(18,?) -> 覆盖 retStr,返回相同的静态变量
- 调用
sprintf
同一个 retStr 的两个引用,其中现在包含来自 u(18,?) 的数据。*
每次调用函数都需要一个单独的缓冲区。您可以将缓冲区传递u(a, b, buf)
给 strcpy ,也可以使用 malloc 之类的东西为函数的每次调用提供缓冲区,并free
在完成时提供缓冲区。
main()
{
char buf1[500], buf2[500]
char test[1000];
int x=sprintf(test,"%s %s",u(17,0,buf1),u(18,?,buf2));
printf(test);
}
...
const char *u(int a,int b, char *buf)
{
...
strcpy(buf,retStr1);
...
return buf;
}
请注意,如果您溢出缓冲区,这里会有很多危险的缓冲区操作,但显示解决问题的最简单方法。
*:这可能反过来发生。C 没有指定函数参数出现的顺序。