首页 > 解决方案 > 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 "";
}

标签: c

解决方案


您对函数的两次调用使用相同的缓冲区。

你这样做:

  • 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 没有指定函数参数出现的顺序。


推荐阅读