C:printf中的sprintf作为第一个参数
在大学里学习C。这不是一个家庭作业,但我试图做一些事情(作业中的一些“创造性”部分)却被卡住了 我知道这是可能的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
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*?@Yanicksprintf()
返回一个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);
}