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: ")) ;
答案 0 :(得分:2)
您没有为stat
分配内存。尝试
char *stat = malloc(MAXLEN);
snprintf(stat, MAXLEN, ...);
^ ^
答案 1 :(得分:0)
使用sprintf时,需要写入一组字符。你正在写一个未初始化的指针。
请改为尝试:
char stat[200];
sprintf(stat, etc...
答案 2 :(得分:0)
好吧,您正在尝试将数据写入未初始化的未分配随机内存位置。现在这不可行。
要么:
char stat[SUFFICIENTLY_LARGE_NUMBER];
snprintf(stat, SUFFICIENTLY_LARGE_NUMBER, ...);
或:
char *stat = malloc(SUFFICIENTLY_LARGE_NUMBER);
snprintf(stat, SUFFICIENTLY_LARGE_NUMBER, ...);
并确保“SUFFICIENTLY_LARGE_NUMBER”是字符串适合的足够字节,而不是非常大。
PS:snprintf,因为您的格式不包含长度限制。如果是,sprintf
可以,但永远不要使用sprintf
无限%s
。您的%.*s
虽然受到正式限制,但还不够,因为表达式会很快返回超过分配缓冲区的大小,因此您需要进行另一次检查以避免超出它。