c-如何使用sprintf()打印成字符*



我正在为一个大学项目做一个c程序。我有下一个代码:

#include <stdio.h>   
#include <stdlib.h>
#include <string.h>
...
int main(int argc, char const *argv[])
{
...
char * resolve = 0;
sprintf(resolve, "%s,%sn", HTTP_HEADER, ERR_404);
printf("%s", resolve);
return 0;
}

我在sprintf的行中得到了Segmentation Fault,这是以某种方式完成这项工作的。P.D:HTTP_HEADER和ERR_404是定义的字符串。

指针resolve指向NULL。当它被传递给sprintf时,函数会尝试取消引用该指针。这样做会调用未定义的行为,在这种情况下会导致程序崩溃。

resolve定义为一个足够大的数组,以容纳生成的字符串。

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

或者,可以使用NULL指针和大小为0的snprintf进行调用。这将返回将写入字符串的字符数。然后,您可以准确地分配那么多空间(加上空终止字节的1(,并再次调用snprintf

int len = snprintf(NULL, 0, "%s,%sn", HTTP_HEADER, ERR_404);
char resolve[len+1];
snprintf(resolve, len, "%s,%sn", HTTP_HEADER, ERR_404);

由于指针解析为空指针,因此使用它写入内存会调用未定义的行为。

您应该在要写入两个字符串的位置分配足够的空间。

可以通过以下方式完成。

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;

最新更新