【发布时间】:2011-08-04 11:14:05
【问题描述】:
fprintf(fp,"IP: %d: %.*s\n",
ip,
strstr(strstr(p->data, "User-Agent:"),"\n") - strstr(p->data, "User-Agent:"),
strstr(p->data, "User-Agent: ") );
fclose(fp);
大家好,正如你所看到的,在上面的语句中,我试图从一个包含整个 http 数据包数据的 char 指针中注销用户代理头。问题是,在摆弄字符串格式之后,我想出了这种 %.*s 格式,它可以让我动态选择要打印到文件的字符数,然后打印它们。代码基本上在做的是,首先,它打印一个 int,然后传递从“User-Agent:”出现到下一个出现换行符的字符数,然后开始传递该数量的字符在“User-Agent:”开始的地方,从整个数据包数据字符串开始。我知道这一切都很混乱,但它工作正常。除了它在 sprintf 中不起作用。
请保存我所有的硬词!任何帮助表示赞赏!
char *stat;
sprintf(stat,"%.*s\0",
strstr(strstr(p->data, "User-Agent:"),"\n") - strstr(p->data, "User-Agent:"),
strstr(p->data, "User-Agent: ")) ;
【问题讨论】:
-
对您使用相同的参数调用相同的
strstr3 次感到羞耻。你知道,这是一个相当昂贵的功能。 -
@Jan:但话说回来,过早的优化是万恶之源。不编写这样的复制粘贴代码的一个更好的论点是它不那么健壮且难以维护。
-
@Paul R:是的,可维护性也是一个很好的论据。至于“过早优化”,嗯,过早优化是为了未经证实的好处而使代码变得更复杂的东西,但这会使代码更简单,更易读。
-
为什么不像:
char *ua_start = strstr(p->data, "User-Agent: "); char *ua_end = strchr(ua_start, '\n'); sprintf(stat, "%.*s\0", ua_end-ua_start, ua_start);(未经测试)。 -
如果您修复此代码以在标头格式错误时不崩溃,则需要对
strstr进行更慢、更丑、更笨重的调用来进行检查。为了 Cthulu 的缘故,请制作一些适当的临时变量来存储所需的位置/长度!
标签: c segmentation-fault printf