我要做的是使用类似于char*
的语法制作新的printf
:
char* myNewString = XXXXprintf("My string says %s", myFirstString);
如果不打印到输出流,这是否可行?
答案 0 :(得分:8)
您正在寻找sprintf
或snprintf
功能。
请注意,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;
}
请注意,{ISO}标准已将snprintf
添加到C.微软的编译器似乎不支持它;它确实提供了一个调用_snprintf
的函数,可能做同样的事情。
还有一个名为asprintf
的GNU扩展,它为你分配字符串:
char *target;
asprintf(&target, "My string says %s", myFirstString);
如果您使用此功能,则必须稍后使用free()
来解除分配字符串。由于这是一个GNU扩展,它将使您的代码不那么便携。
答案 1 :(得分:6)
当然,这是sprintf
的用途:printf
样式格式化为提供的char*
。
This documentation涵盖了sprintf
和相关的printf
功能。请务必考虑使用snprintf
:通过限制实际复制到提供的缓冲区的字节数,正确使用会使它比sprintf
更安全。
用法与您的示例略有不同:您提供了由sprintf
修改的缓冲区。与其他printf
函数一样,函数不返回结果,返回int
:打印的字符数。
char myNewString[MAX_LEN];
snprintf(myNewString, MAX_LEN, "My string says %s", myFirstString);
答案 2 :(得分:1)
您正在寻找的功能是sprintf
。
答案 3 :(得分:1)
如果你不介意GNUisms,asprintf
可能是你最接近你的东西:它会自动为你分配一个缓冲区(但你做必须记住事后free
。
char *target;
int ret = asprintf(&target, "My string says %s", myFirstString);
// if ret < 0, the contents of target are undefined
答案 4 :(得分:0)
我建议snprintf
,它比sprintf
更安全。
答案 5 :(得分:-1)
sprintf应该为你做到这一点。
与printf的唯一区别是第一个参数是用于存储字符串的char *,即
sprintf(myNewString, "My string says %s", myFirstString);