我目前正在研究一个问题,我必须将空指针变成一个已签名的char,即short,long,long long。 (这些看起来很简单,我可以创建一个tmp并删除空白。)
让我感到困惑的是: 将void指针转换为: 有符号十进制,无符号八进制,无符号十进制,无符号十六进制,%f转换,其中,“ double arg取整并覆盖为十进制表示法。
在大多数这些转换中,我只会使用基本正确的atoi吗?
我将使用可变参数,并将知道实际的值,但是我的计划是将所有内容都转换为void指针,然后根据格式进行转换。转换是我不清楚的。为了清楚起见:我将va_arg转换为空指针,并将其存储在结构中。然后,根据格式,我将把每个void指针转换为正确的数据类型。我只是想弄清楚如何对上述数据类型进行每次转换
谢谢您的帮助。
void ft_conversion_length_di(t_main *node)
{
if (node->length == 'H')
node->arg = (signed char)node->arg;
if (node->length == 'h')
node->arg = (short)node->arg;
if (node->length == 'l')
node->arg = (long)node->arg;
if (node->length == 'E')
node->arg = (long long)node->arg;
}
答案 0 :(得分:1)
如果要从知道类型的可变参数函数中读取值,则void *
不是您想要的。您可以将void *
转换为另一种指针类型,但不能转换为“值”类型。
您想要的是一个可以容纳您期望的任何类型的联合,以及包含该联合和类型指示符的结构。
例如
enum value_type {
VAL_CHAR,
VAL_SHORT,
VAL_LONG,
VAL_LONGLONG,
VAL_FLOAT,
VAL_DOUBLE
};
union val {
char c;
short s;
long l;
long long ll;
float f;
double d;
};
struct value {
enum value_type type;
union val v;
};
void myfunc(const char *format, ...)
{
va_list ap;
va_start(ap, format);
while (/* has more values */) {
struct value s;
if (/* is char */) {
s.type = VAL_CHAR;
s.v.c = va_arg(ap, char);
} else if (/* is short */) {
s.type = VAL_SHORT;
s.v.s = va_arg(ap, short);
} else if (/* is long */) {
s.type = VAL_LONG;
s.v.l = va_arg(ap, long);
} else if (/* is long long */) {
s.type = VAL_LONGLONG;
s.v.ll = va_arg(ap, long long);
} else if (/* is float */) {
s.type = VAL_FLOAT;
s.v.l = va_arg(ap, float);
} else if (/* is double */) {
s.type = VAL_DOUBLE;
s.v.l = va_arg(ap, double);
}
/* do something with s */
}
va_end(ap);
}