c - 如何使用 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 是定义的字符串。
解决方案
指针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);