实际上,我想要一个变量,它可以接收各种值,无论是 int、float 还是 char。谁能告诉我一种方法来做到这一点。但是程序应该是 C 语言(而不是 C++)。
问问题
329 次
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 long
或unsigned
相同的变体) - 它是浮点数的有效字符序列吗?如果是这样,请将其转换为
float
or )double
long 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 double
(double
float
于 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 回答