Как я могу использовать sprintf () для печати на символ *? - PullRequest
1 голос
/ 18 февраля 2020

Я делаю c программу для университетского проекта. У меня есть nex-код:

#include <stdio.h>   
#include <stdlib.h>
#include <string.h>

...

int main(int argc, char const *argv[])
{
    ...
    char * resolve = 0;
    sprintf(resolve, "%s,%s\n", HTTP_HEADER, ERR_404);
    printf("%s", resolve);
    return 0;
}

Я получаю Сегментационный сбой в строке sprintf, это каким-то образом получить эту работу. PD: HTTP_HEADER и ERR_404 - определенные строки.

Ответы [ 2 ]

8 голосов
/ 18 февраля 2020

Указатель resolve указывает на NULL. Когда он передается в sprintf, функция пытается разыменовать этот указатель. Это вызывает неопределенное поведение , которое в этом случае заставляет программу создавать sh.

Определить resolve вместо массива, достаточного для хранения результирующей строки.

char resolve[1000];
sprintf(resolve, "%s,%s\n", HTTP_HEADER, ERR_404);

Кроме того, вы можете вызвать snprintf с указателем NULL и размером 0. Это вернет количество символов, которое будет записано в строку. Затем вы можете выделить именно столько места (плюс 1 для нулевого завершающего байта) и снова вызвать snprintf.

int len = snprintf(NULL, 0, "%s,%s\n", HTTP_HEADER, ERR_404);
char resolve[len+1];
snprintf(resolve, len, "%s,%s\n", HTTP_HEADER, ERR_404);
1 голос
/ 18 февраля 2020

Поскольку разрешение указателя является нулевым указателем, то использование его для записи в память вызывает неопределенное поведение.

Вы должны выделить достаточно места, чтобы записать две строки.

Это можно сделать следующим образом.

size_t n = strlen( HTTP_HEADER );

char *resolve = malloc( n + strlen( ERR_404 ) + 3 );

strcpy( resolve, HTTP_HEADER );
resolve[n] = ',';

++n;

strcpy( resolve + n, ERR_404 );
strcat( resolve + n, "\n" );

printf("%s", resolve);

//...

free( resolve );
resolve = NULL;
...