字符串格式在fprintf中有效,但在sprintf中不起作用,给出了分段错误

时间:2011-08-04 11:14:05

标签: c segmentation-fault printf

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: ")) ;

3 个答案:

答案 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虽然受到正式限制,但还不够,因为表达式会很快返回超过分配缓冲区的大小,因此您需要进行另一次检查以避免超出它。