首页 > 解决方案 > 如何使用 sprintf() 打印到 char *?

问题描述

我正在为一个大学项目做交流计划。我有下一个代码:

#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 是定义的字符串。

标签: cmemory-managementconcatenationc-strings

解决方案


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

定义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);

推荐阅读