我要做的是char*使用类似于下面的语法创建一个新的printf:
char* myNewString = XXXXprintf("My string says %s", myFirstString);
Run Code Online (Sandbox Code Playgroud)
如果不打印到输出流,这是否可行?
你正在寻找sprintf或snprintf功能.
注意,sprintf它不会返回指向新分配字符串的指针; 你必须自己分配字符串,并确保它足够大:
char target[100];
sprintf(target, "My string says %s", myFirstString);
Run Code Online (Sandbox Code Playgroud)
除非您可以确定目标足够大,否则应该使用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;
}
Run Code Online (Sandbox Code Playgroud)
注意,它snprintf是由1999 ISO标准添加到C. 微软的编译器似乎不支持它; 它确实提供了一个它调用的功能_snprintf,可能会做同样的事情.
还有一个GNU扩展名称asprintf,它为你分配字符串:
char *target;
asprintf(&target, "My string says %s", myFirstString);
Run Code Online (Sandbox Code Playgroud)
如果你使用它,你将不得不在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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |