-4

实际上,我想要一个变量,它可以接收各种值,无论是 int、float 还是 char。谁能告诉我一种方法来做到这一点。但是程序应该是 C 语言(而不是 C++)。

4

5 回答 5

3

您应该始终使用对您的应用程序有意义的类型,但如果您真的需要“无类型”数据元素,您可以使用 a 来实现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
于 2013-04-09T12:01:12.493 回答
1

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

  • 它是整数的有效字符序列吗?如果是这样,将其转换为整数(以适合它的为准:signed char, short, int, long,long longunsigned相同的变体)
  • 它是浮点数的有效字符序列吗?如果是这样,请将其转换为floator )doublelong double
  • 否则它是一个字符串(除非你想有一个单一的字符类型)

完成后,将转换后的值放入联合的适当成员并设置类型:

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 doubledoublefloat

于 2013-04-09T12:20:32.093 回答
1

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

union {
  int i;
  char c;
  float f;
} u;
于 2013-04-09T11:58:32.347 回答
1

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

于 2013-04-09T12:01:41.563 回答
0

使用 void 指针来存储变量的地址并进行类型转换以将其取回“每种”类型。联合你仍然必须事先知道你要使用什么类型。要在宏中使用,请查找 gcc typeof

于 2013-04-09T12:00:32.087 回答