Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:printf中的sprintf作为第一个参数_C_Printf - Fatal编程技术网

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

C:printf中的sprintf作为第一个参数,c,printf,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 w

在大学里学习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故障。

您至少应该首先为缓冲区分配内存(并在最后释放):

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

printf("%d", printf("23.4")); // -> 23.44
sprintf还返回打印的字符数,因此将其作为printf的参数可能不是您想要的

造成seg错误的原因是缓冲区字符串没有指向任何东西。您希望将代码更改为以下内容:

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

为此使用
sprintf
是不正当的。相反,请尝试:

printf("Value with %d decimals is %.*f", decimals, decimals, pi);
printf()
sprintf()
都返回一个
int
值。这是字符总数

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

如果要打印
sprintf()
写入的字符数,则只能使用
sprintf()
作为
printf()
的参数,因为
sprintf
将数据写入内存中垃圾指向的某个位置(指针
缓冲区中)。您需要使用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);
}

好吧,我明白了。但是如果sprintf()和printf()位于不同的函数中?一个函数为printf函数的第一个参数返回一个char*?@Yanick
sprintf()
返回一个int。@Yanick我认为您使用的单词“returns”是错误的。printf/sprintf都返回整数。但是他们把char*作为他们的第一个参数。我将编辑这个问题以澄清(我确实理解函数返回的内容,但我认为这是一个误解)如果要使用固定大小的缓冲区,就不需要
malloc
;您可以使用char buf[256]
(除非您担心堆栈的使用)。不管怎样,人们都应该使用
snprintf
而不是
sprintf
。太棒了!我尊重你,我可以纠正:)我从来没有听说过这种行为(阅读)
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);
}