检查它的char或整数

时间:2011-03-01 21:18:39

标签: c char int

这是一个整数数组:

int values[] = { 75, '*', 5,'-' };

for(i=0 ; i<size ; i++){
    // Here
}

如何检查 values[i] 是整数还是操作?

也许该值等于操作的Ascii,在这种情况下如何处理它?<​​/ p>

3 个答案:

答案 0 :(得分:8)

你做不到。就编译器而言,常量42'*'是同一个。在编译的目标代码中,它们都表示为整数42。

如果需要区分整数和字符,可以使用布尔标志或枚举来指示值的类型,或者将整数和字符保存在单独的数组中。

请注意,在C ++中,但C中的不是,存在细微差别:42的类型为int,而'*'的类型为char {1}},因此您可以使用重载的函数或模板来区分这一事实。

答案 1 :(得分:4)

这是一条危险的道路。示例中的数组将(在编译期间)转换为:

int values[] = {75, 42, 5, 45};

所以当你看到数字42时......它是什么?它是'*'字符,还是您实际上是指42

您也不能依赖于类型转换,因为所有值都会转换为int,因为它们存储在整数数组中。最好的办法是创建一个既包含类型又包含值的结构,如下所示:

typedef struct
{
    int type;  //0 for int, 1 for operator, and so forth.
    int value; //holds either a character code or an integer value
    //you could use a union here, if you felt it would make things cleaner...
} Token;

然后检查以查看令牌的类型只是查看token.type

希望这有帮助!

PS:作弊的答案是使用动态类型的语言。您的工作量较少,但速度较慢,而且我不知道它是否适合您。

答案 2 :(得分:0)

您的数组元素不能是简单的整数。 试试这个:

enum ElementType {INTEGER, OPERATION};
struct ArrayElement {
    enum ElementType etype;
    int evalue;
};
struct ArrayElement values[] = {
    {INTEGER, 75}, {OPERATION, '*'}, {INTEGER, 5}, {OPERATION, '-'}
};

for (i = 0; i < sizeof values / sizeof *values; i++) {
    /* Here */
    switch (values[i].etype) {
        default: printf("unrecognized type. value is %d.\n", values[i].value);
                 break;
        case INTEGER: printf("INTEGER with value %d.\n", values[i].value);
                      break;
        case OPERATION: printf("OPERATION with value '%c'.\n", values[i].value);
                        break;
    }
}