Формат строки работает в fprintf, но не работает в sprintf, дает ошибку сегментации - PullRequest
0 голосов
/ 04 августа 2011
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);

Привет Все, как вы можете видеть, в приведенном выше заявлении я пытаюсь списать только заголовок User Agent из указателя char, который содержит все данные пакета http. Дело в том, что, поигравшись со строковым форматом, я пришел к формату%. * 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 ]

2 голосов
/ 04 августа 2011

Вы не выделяете память для stat. Попробуйте

char *stat = malloc(MAXLEN);
snprintf(stat, MAXLEN, ...);
 ^              ^
0 голосов
/ 04 августа 2011

Итак, вы пытаетесь записать данные в неинициализированную нераспределенную случайную ячейку памяти.Теперь это не может работать.

Либо выполните:

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, хотя и формально ограничен, недостаточен, потому что выражение с радостью вернет больше, чем размер выделенного буфера, поэтому вам нужна еще одна проверка, чтобы избежать его переполнения.

0 голосов
/ 04 августа 2011

Когда вы используете sprintf, вам нужен массив символов для записи. Вы пишете на неинициализированный указатель.

Попробуйте вместо этого:

char stat[200];
sprintf(stat, etc...
...