关于sprint()函数的实现原理,以及分析以下代码的问题
谁可以帮我解释下该函数的实现原理,功能我很清楚,就不必要了.然后是以下代码有什么问题呢?谢谢
int Stdout_dump(const unsigned char* data, int len)
{
int i;
char buf[40960] = {0};
for (i = 0; i < len; ++i) {
sprintf(buf, "%s%02x ", buf, (int)data[i]);
if ((i %16) == 15)
sprintf(buf, "%s\n ", buf);
else
sprintf(buf, "%s ", buf);
}
if ((i % 16) != 0)
sprintf(buf, "%s\n ", buf);
doPrintf(buf, strlen(buf));
return len;
}
[解决办法]
int Stdout_dump(const unsigned char* data, int len)
{
int i;
char buf[40960] = {0};//栈上的数据太大,容易出问题
for (i = 0; i < len; ++i) {
sprintf(buf, "%s%02x ", buf, (int)data[i]);//buf这样使用会出现数据覆盖,下同
if ((i %16) == 15)
sprintf(buf, "%s\n ", buf);
else
sprintf(buf, "%s ", buf);
}
if ((i % 16) != 0)
sprintf(buf, "%s\n ", buf);
doPrintf(buf, strlen(buf));
return len;
}
[解决办法]
1. sprintf()的实现
http://fxr.watson.org/fxr/source/kern/subr_prf.c#L432
2.
int Stdout_dump(const unsigned char* data, int len)
{
int i;
char buf[40960] = {0};//栈上的数据太大, #用malloc吧!
for (i = 0; i < len; ++i) {
sprintf(buf, "%s%02x ", buf, (int)data[i]);//buf这样使用会出现数据覆盖,下同
// ## 不会覆盖只是效率太低
if ((i %16) == 15)
sprintf(buf, "%s\n ", buf);
else
sprintf(buf, "%s ", buf);
}
if ((i % 16) != 0)
sprintf(buf, "%s\n ", buf);
doPrintf(buf, strlen(buf));
return len;
}