C:printf里面的sprintf作为第一个参数

时间:2010-10-08 15:25:08

标签: c printf

在大学学习C语言。这不是一个功课,但我试图做一些事情(一些“创造性”的任务部分)并陷入困境。

我知道这是可能的

printf("%d\n", printf("23.4")); // -> 23.44 (i.e. 23.4 + 4 bytes written)

但是如何使用sprintf()作为printf()的第一个参数?

类似的东西:

char * getFormatString(int n) {
   char * buffer;

   sprintf(buffer, "Value with %%d decimals is %%.%df", n);

   return buffer; 
}

void foo() {
   int decimals = 2;
   float pi = 3.141592;

   printf(getFormatString(decimals), decimals, pi);  // should output "Value with 2 decimals is 3.14"
}

这甚至可能吗?到目前为止,我在执行时遇到了一个seg错误。

5 个答案:

答案 0 :(得分:6)

为此目的使用sprintf是有悖常理的。而是尝试:

printf("Value with %d decimals is %.*f", decimals, decimals, pi);

答案 1 :(得分:2)

您至少应该首先为缓冲区分配内存(并在结束时释放它):

char * buffer;
int decimals = 2;
float pi = 3.141592;

buffer = (char *) malloc(256); /* big enough buffer */
sprintf(buffer, "Value with %%d decimals is %%.%df", decimals);
printf(buffer, decimals, pi);

free(buffer);

答案 2 :(得分:2)

printf返回打印的字符数,因此您的第一个示例实际上是

printf("%d", printf("23.4")); // -> 23.44

sprintf还会返回打印的字符数,因此将其作为printf的参数可能不是您想要的。

你是seg-faulting的原因是你的缓冲区字符串没有指向任何东西。您想将代码更改为以下内容:

char buffer[1024];    // buffer has to be an actual string (or you could use malloc)
int decimals = 2;
float pi = 3.141592;

sprintf(buffer, "Value with %%d decimals is %%.%df", decimals);

printf(buffer, decimals, pi);

答案 3 :(得分:1)

你得到一个段错误,因为sprintf将数据写入内存中的某个位置(垃圾指向buffer)。您需要使用malloc分配一些内存,例如:

buffer = malloc(100);

在函数getFormatString中使用sprintf之前。然后,请记住在使用字符串后释放此内存。在这个特定的代码中有一个内存泄漏,因为你没有将getFormatString返回的指针存储在任何地方。

更正后的代码:

char *getFormatString(int n) {
    char *buffer = malloc(100);
    sprintf(buffer, "Value with %%d decimals is %%.%df", n);
    return buffer;
}

void foo() {
    int decimals = 2;
    float pi = 3.141592;
    char *fmtstr = getFormatString(decimals);
    printf(fmtstr, decimals, pi);  // should output "Value with 2 decimals is 3.14"
    free(fmtstr);
}

答案 4 :(得分:0)

printf()sprintf()都返回int值。这是总字符数。

int sprintf ( char * str, const char * format, ... );
int printf ( const char * format, ... );

如果要打印由sprintf()撰写的字符数,则只能使用printf()作为sprintf()的参数。