如何在c(不是在c ++中)输入而不管数据类型?我想有一个通用变量,可以存储任何类型的数据类型变量

时间:2013-04-09 11:50:52

标签: c types type-systems

实际上我想要一个变量来接收各种值,无论是int还是float或char。任何人都可以告诉我一种方法来做到这一点。但程序应该是C(不是C ++)。

5 个答案:

答案 0 :(得分:3)

您应始终使用对您的应用程序有意义的类型,但如果您确实需要“无类型”数据元素,则可以使用void *执行此操作,然后通过类型转换将其用于任何您通过它:

void *myvar = malloc(100);  // set up typeless element

*(int *)myvar = 10;         // cast to an int and save an int
printf("%d\n", *(int *)myvar);  // print as an int

*(float *)myvar = 10.25;    // cast to a float and save a float
printf("%f\n", *(float *)myvar); // print as a float

答案 1 :(得分:1)

您的问题有两个答案。一个是使用联合(如果你只限于int,char和float)。另一种是致命的 void * 类型。它们都不是良好的编码实践。 也许你应该改变问题:)

union {
  int i;
  char c;
  float f;
} u;

答案 2 :(得分:1)

C是一种强大的静态类型语言,因此在您要求的意义上,您不能拥有动态变量。我猜你可以有一个无效指针(void *)指向任何东西,但它实际上不是一种推荐的方法(你怎么知道将它取消引用呢?)。

答案 3 :(得分:1)

将输入读取为文本字符串(字符数组)。然后分析一下:

  • 是整数的有效字符序列吗?如果是这样,请将其转换为整数(以适合者为准:signed charshortintlonglong longunsigned各种各样的)
  • 它是浮点数的有效字符序列吗?如果是,请将其转换为floatdoublelong double
  • 否则它是一个字符串(除非你想要一个字符类型)

完成后,将转换后的值放入union的相应成员中并设置类型:

typedef struct
{
  int Type; // tells which one of the below holds the value
  union
  {
    signed char sc;
    unsigned char uc;
    short s;
    unsigned short us;
    int i;
    unsigned ui;
    long l;
    unsigned long ul;
    long long ll;
    unsigned long long ull;
    float f;
    double d;
    long double ld;
    char* str;
    char ch;
  } Value;
} tValue;

请注意,看起来像整数的内容可能不适合最大的整数类型,在这种情况下,您可以选择将其转换为浮点值,可能会丢失精度。否则你可能会说这是一个错误并适当地处理它。

此外,在转换浮点数时,您可能应首先使用较大的类型(long double),然后尝试下一个较小的类型(double然后float)以查看值是否为在这两种情况下都是相同的,在这种情况下,您可以选择较小的类型。

答案 4 :(得分:0)

使用void指针存储变量的地址和类型转换,以便为“每个”类型返回它。联盟你还必须事先知道你将要使用的类型。 要在宏中使用,请查找gcc typeof