2

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

char* myNewString = XXXXprintf("My string says %s", myFirstString);

这在不打印到输出流的情况下可行吗?

4

6 回答 6

8

您正在寻找sprintforsnprintf功能。

请注意,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 扩展,它会使您的代码的可移植性降低。

于 2012-09-05T19:02:24.877 回答
6

当然,这就是sprintf:将printf样式格式化为提供的char*.

本文档涵盖sprintf和相关printf的功能。请务必考虑snprintf改用:正确使用会比sprintf限制实际复制到提供的缓冲区的字节数更安全。

用法与您的示例略有不同:您提供一个由sprintf. 该函数返回结果,与其他printf函数一样,返回一个int: 打印的字符数。

char myNewString[MAX_LEN];
snprintf(myNewString, MAX_LEN, "My string says %s", myFirstString);
于 2012-09-05T19:00:28.373 回答
1

您正在寻找的功能是sprintf.

http://www.manpages.info/linux/sprintf.3.html

于 2012-09-05T19:00:32.103 回答
1

如果您不介意 GNUisms,它asprintf可能是最接近您所追求的东西:它会自动为您分配一个缓冲区(但之后您必须记住free它)。

char *target;
int ret = asprintf(&target, "My string says %s", myFirstString);
// if ret < 0, the contents of target are undefined
于 2012-09-05T19:04:34.940 回答
0

我推荐snprintf,它比sprintf.

于 2012-09-05T19:01:54.410 回答
-1

sprintf 应该为您做到这一点。

与 printf 的唯一区别是第一个参数是一个 char*,用于存储字符串,即

sprintf(myNewString, "My string says %s", myFirstString);
于 2012-09-05T19:01:39.760 回答