没有输出的printf样式格式

Joh*_*ell 2 c string printf

我要做的是char*使用类似于下面的语法创建一个新的printf:

char* myNewString = XXXXprintf("My string says %s", myFirstString);
Run Code Online (Sandbox Code Playgroud)

如果不打印到输出流,这是否可行?

Kei*_*son 8

你正在寻找sprintfsnprintf功能.

注意,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扩展,它将使您的代码不那么便携.


pb2*_*b2q 6

当然,这是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)