我正在尝试编写一个简单的函数,它将数字转换为相对于给定格式的字符串,如下所示:
char * write_number(const char *format, void *number) {
char mystring[50];
sprintf(mystring, format, number);
return mystring;
}
唯一的问题是这适用于整数数据类型,但不适用于float / double数据类型。无论数据类型如何,有没有办法使这项工作。
谢谢!
除了原来的问题:
感谢您的建议。我没有设法使它工作,这是我想要得到的完整的例子。
#include <stdio.h>
void write_number(const char *format, void *number) {
char mystring[50];
sprintf(mystring, format, *number);
printf("%s\n", mystring);
}
int main(void) {
int a = 10;
float b = 20;
double c = 40;
write_number("int: %03d", &a);
write_number("float: %6.2f", &b);
write_number("double: %6.2f", &c);
return 0;
}
答案 0 :(得分:0)
sprintf
的格式字符串指定数据类型,例如"%i"
打印和整数,"%f"
打印浮点数 - 因此您需要根据数据类型更改格式字符串
另请注意,由于函数返回指向局部变量mystring
的指针,因此该函数不能用于int,因为当函数返回时,这将超出范围,并且可以随时被覆盖另一个值,那么返回的指针将指向一些随机值而不是字符串。
答案 1 :(得分:0)
对于使用局部变量{{1}}的地址的调用代码是未定义的行为。
&#34;为什么这适用于整数数据类型?&#34;
未定义的行为并不意味着代码&#34;不会工作&#34;。它并不意味着如果它今天有效(带整数),它将在明天起作用。这意味着行为未定义。
答案 2 :(得分:-1)
sprintf
已经处理了其参数的类型;你只需要确保传递给它的格式字符串与它的参数匹配。例如,"%f", 3.125f
格式化浮点数"%d", 12
以格式化有符号整数"%e", 3.125
以格式化双精度浮点数。请尝试阅读this。
但是,无论如何,您的功能将无法正常工作,因为编译错误会告诉您。 mystring
被声明为堆栈上的局部变量,因此当函数返回时它将不复存在。
此外,您将number
的地址传递给sprintf
而不是值。要传递该值,您需要取消引用它:sprintf(mystring, format, *number);
你的函数可以使用整数类型,因为指针是整数,所以如果你调用write_number("%d\n", 55)
,你将传递一个指向内存地址55的指针,sprintf
将其解释为整数,因为%d
。如果您的int
和void *
的大小不同,则无效。
要实际传递指针而不是将int转换为指针,请执行以下操作:
char *str;
float num = 8.375f;
str = write_number("%f", &num);