如何避免C中的sprintf调用
我必须准备一个字符串,该字符串必须通过套接字发送,该字符串使用不同的数据类型int、char、unsigned char等构建。。。由于我在很多地方使用过它,我的callgrind报告说,sprintf和strcat消耗的大部分CPU 有人能告诉我这个sprintf和strcat的替代方案吗 下面是一段代码如何避免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,
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等编写我自己的函数。。