如何在C中避免sprintf调用

时间:2014-05-14 10:41:23

标签: c

我必须准备一个必须通过套接字发送的字符串,该字符串使用不同的数据类型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);

任何有用的帮助。

此致

2 个答案:

答案 0 :(得分:3)

您正在使用 Shlemiel the painter's algorithm

相反,你可以按照你写的长度推进pData,而不是一遍又一遍strcatsprintf会返回您需要添加的号码。

但正如@alk在评论中指出的那样,将pData_temp直接写入套接字可能会更好 - 不要打扰制作一个大字符串。

答案 1 :(得分:2)

代码中有缓冲区溢出。您只为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!
   }
}