如何避免C中的sprintf调用

如何避免C中的sprintf调用,c,C,我必须准备一个字符串,该字符串必须通过套接字发送,该字符串使用不同的数据类型int、char、unsigned char等构建。。。由于我在很多地方使用过它,我的callgrind报告说,sprintf和strcat消耗的大部分CPU 有人能告诉我这个sprintf和strcat的替代方案吗 下面是一段代码 pData_temp = (char *)malloc(200); pData = (char *)malloc(500); sprintf(pData_temp,

我必须准备一个字符串,该字符串必须通过套接字发送,该字符串使用不同的数据类型int、char、unsigned char等构建。。。由于我在很多地方使用过它,我的callgrind报告说,sprintf和strcat消耗的大部分CPU

有人能告诉我这个sprintf和strcat的替代方案吗

下面是一段代码

    pData_temp = (char *)malloc(200);
    pData = (char *)malloc(500);
    sprintf(pData_temp, "String to be sent over socket at time %u $%04x",seconds,id);
    strncpy(pData,pData_temp,strlen(pData_temp);

    for in t(i=0; i < 1000; i++)
    {
        sprintf(pData_temp,"%02x%04x%08x%08x%08x",var1,var2,var3,var4,var5);
        strcat(pData,pData_temp);
    }
    sprintf(pData_temp,"\n");
    strcat(pData,pData_temp)

    sock_send(pData,strlen(pData);

    free(pData);
    free(pData_temp);
pData_temp=(char*)malloc(200);
pData=(char*)malloc(500);
sprintf(pData_temp,“在时间%u$%04x通过套接字发送的字符串”,秒,id);
strncpy(pData,pData_temp,strlen(pData_temp);
对于t(i=0;i<1000;i++)
{
sprintf(数据温度,“%02x%04x%08x%08x%08x%08x”,var1、var2、var3、var4、var5);
strcat(数据、数据和温度);
}
sprintf(pData_temp,“\n”);
strcat(数据、数据和温度)
sock_send(pData),strlen(pData);
免费(pData);
免费(pData_temp);
谢谢你的帮助

问候您正在使用的

相反,您可以按写入的长度推进
pData
,而不必一遍又一遍地对其进行压缩。
sprintf
返回需要添加的数字

但正如@alk在评论中指出的那样,直接将
pData\u temp
写入套接字可能会更好——根本不用麻烦制作一个大字符串。

您正在使用的

相反,您可以按写入的长度推进
pData
,而不必一遍又一遍地对其进行压缩。
sprintf
返回需要添加的数字


但正如@alk在评论中指出的那样,直接将
pData_temp
写入套接字可能会更好——根本不用麻烦生成一个大字符串。

代码中存在缓冲区溢出。您只为pData分配500字节,并将1000个30字节的字符串连接到它

数据真的需要ASCII吗?您可以通过使用二进制数据而不是ASCII来提高算法的效率:-

struct Data // turn off padding!
{
   char var1;
   short var2;
   int var3, var4, var5;
};

void somefunc ()
{
   int i;
   for (i = 0 ; i < 1000 ; ++i)
   {
     struct Data data; 
     // set up the members of data
     socket_write (&data, sizeof data); // not a real function, pseudo-code!
   }
}
struct Data//关闭填充!
{
charvar1;
短var2;
int var3,var4,var5;
};
void somefunc()
{
int i;
对于(i=0;i<1000;++i)
{
结构数据;
//设置数据的成员
socket_write(&data,sizeof data);//不是真正的函数,是伪代码!
}
}

代码中存在缓冲区溢出。只为pData分配500字节,并将1000个30字节的字符串连接到其中

数据真的需要ASCII吗?您可以通过使用二进制数据而不是ASCII来提高算法的效率:-

struct Data // turn off padding!
{
   char var1;
   short var2;
   int var3, var4, var5;
};

void somefunc ()
{
   int i;
   for (i = 0 ; i < 1000 ; ++i)
   {
     struct Data data; 
     // set up the members of data
     socket_write (&data, sizeof data); // not a real function, pseudo-code!
   }
}
struct Data//关闭填充!
{
charvar1;
短var2;
int var3,var4,var5;
};
void somefunc()
{
int i;
对于(i=0;i<1000;++i)
{
结构数据;
//设置数据的成员
socket_write(&data,sizeof data);//不是真正的函数,是伪代码!
}
}


首先,停止转换
malloc()
的返回值,并使用
snprintf()
而不是
sprintf()
出于安全考虑。@user3477950这两个
sprintf
语句都是安全的。这可能需要很长时间,因为您在循环中至少运行了1000次。不要连接单个字符串并发送结果,而是直接发送单个字符串。@user3631987 Web搜索将首先生成有关mallocFirst的信息,停止强制转换
malloc()
的返回值,并使用
snprintf()
而不是
sprintf()
出于安全考虑。@user3477950这两个
sprintf
语句都是安全的。这可能需要很长时间,因为您在一个循环中至少运行了1000次。不要连接单个字符串并发送结果,而是直接发送单个字符串。@user3631987 Web搜索将生成有关malloclear的信息奈德:不要用“魔法数字”在你的代码中。将它们定义为常量。嗨,Skizz,我同意存在缓冲区溢出,这是一个示例伪代码,我写它来解释我在寻找什么,在实际代码中,这一直是小心的。嗨,Ludin,我同意你的说法,我总是使用#用正确的名称定义而不是神奇的数字,这段代码只是用来解释什么我一直在寻找,无论如何,谢谢你给我上了一课:不要使用“神奇数字”在你的代码中。将它们定义为常量。嗨,Skizz,我同意存在缓冲区溢出,这是一个示例伪代码,我写它来解释我在寻找什么,在实际代码中,这一直是小心的。嗨,Ludin,我同意你的说法,我总是使用#用正确的名称定义而不是神奇的数字,这段代码只是用来解释什么我一直在寻找,无论如何感谢你的评论是的,我做了你建议的事情,就是避免stract,这很有帮助,我不能从pData_temp发送中间信息,而是我需要创建一个信息字符串并通过套接字转发。但我正在考虑如何避免sprintf,因为这似乎是更昂贵的操作…谢谢你通过将整数转换为十六进制字符串,您可以使用一个特殊用途的打印函数,该函数没有格式字符串解析的开销。简单示例:是的,这就是我所看到的。谢谢,我将为%02x、%04x、%08x、%016x等编写我自己的函数。是的,我按照您的建议做了,避免了stract,这很有帮助,而且我无法发送赌注在pData_temp中的信息之间,我需要创建一个信息字符串并通过套接字转发。但我正在考虑如何避免sprintf,因为这似乎是一个更昂贵的操作…谢谢如果您只将int转换为十六进制字符串,那么您可以使用一个特殊用途的打印函数,它没有格式化字符串p的开销简单的例子:是的,这就是我所看到的谢谢,我将为%02x、%04x、%08x、%016x等编写我自己的函数。。