我想要做的是char*
使用类似于以下的语法创建一个新的printf
:
char* myNewString = XXXXprintf("My string says %s", myFirstString);
这在不打印到输出流的情况下可行吗?
您正在寻找sprintf
orsnprintf
功能。
请注意,sprintf
它不会返回指向新分配字符串的指针;您必须自己分配字符串,并确保它足够大:
char target[100];
sprintf(target, "My string says %s", myFirstString);
除非您可以确定目标足够大,否则您应该使用snprintf
,它会限制复制到目标字符串的字节数。
snprintf
返回将写入目标字符串的字符数。您可以snprintf
使用空目标和零大小调用以找出需要多少大缓冲区,然后分配缓冲区并再次调用它以写入目标(注意:我的原始代码示例有一个错误。 )
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *myFirstString = "hello, world";
char *target;
size_t size = snprintf(NULL, 0, "My string says %s", myFirstString);
target = malloc(size+1); /* +1 for terminating '\0' */
if (target == NULL) {
fprintf(stderr, "Allocation failed\n");
exit(EXIT_FAILURE);
}
size = snprintf(target, size+1, "My string says %s", myFirstString);
printf("target = \"%s\"\n", target);
return 0;
}
请注意,它snprintf
是由 1999 ISO 标准添加到 C 中的。微软的编译器似乎不支持它;它确实提供了一个它调用的函数,_snprintf
它可能做同样的事情。
还有一个名为的 GNU 扩展asprintf
,它会为您分配字符串:
char *target;
asprintf(&target, "My string says %s", myFirstString);
如果你使用它,你将不得不free()
稍后使用它来释放字符串。而且由于这是一个 GNU 扩展,它会使您的代码的可移植性降低。
当然,这就是sprintf
:将printf
样式格式化为提供的char*
.
本文档涵盖sprintf
和相关printf
的功能。请务必考虑snprintf
改用:正确使用会比sprintf
限制实际复制到提供的缓冲区的字节数更安全。
用法与您的示例略有不同:您提供一个由sprintf
. 该函数不返回结果,与其他printf
函数一样,返回一个int
: 打印的字符数。
char myNewString[MAX_LEN];
snprintf(myNewString, MAX_LEN, "My string says %s", myFirstString);
您正在寻找的功能是sprintf
.
如果您不介意 GNUisms,它asprintf
可能是最接近您所追求的东西:它会自动为您分配一个缓冲区(但之后您必须记住free
它)。
char *target;
int ret = asprintf(&target, "My string says %s", myFirstString);
// if ret < 0, the contents of target are undefined
我推荐snprintf
,它比sprintf
.
sprintf 应该为您做到这一点。
与 printf 的唯一区别是第一个参数是一个 char*,用于存储字符串,即
sprintf(myNewString, "My string says %s", myFirstString);