没有输出的printf样式格式

时间:2012-09-05 18:59:11

标签: c string printf

我要做的是使用类似于char*的语法制作新的printf

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

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

6 个答案:

答案 0 :(得分:8)

您正在寻找sprintfsnprintf功能。

请注意,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

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

答案 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);