具有未知输入数据类型的C函数

时间:2016-07-24 17:30:51

标签: c string pointers type-conversion void

我正在尝试编写一个简单的函数,它将数字转换为相对于给定格式的字符串,如下所示:

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

3 个答案:

答案 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。如果您的intvoid *的大小不同,则无效。

要实际传递指针而不是将int转换为指针,请执行以下操作:

char *str;
float num = 8.375f;
str = write_number("%f", &num);