您如何打字无效指针?

时间:2019-07-03 16:58:47

标签: c casting type-conversion

我目前正在研究一个问题,我必须将空指针变成一个已签名的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;
}

1 个答案:

答案 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);
}