首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >检查它是一个字符还是一个整数

检查它是一个字符还是一个整数
EN

Stack Overflow用户
提问于 2011-03-01 21:18:38
回答 3查看 416关注 0票数 0

这是一个整数数组:

代码语言:javascript
代码运行次数:0
运行
复制
int values[] = { 75, '*', 5,'-' };

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

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

也许这个值等于一个操作的Ascii,在这种情况下该如何处理呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-01 21:31:48

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

代码语言:javascript
代码运行次数:0
运行
复制
int values[] = {75, 42, 5, 45};

所以当你看到数字42..。那是什么?是'*'字符,还是指数字42

您也不能依赖类型转换,因为所有的值都将转换为int,因为它们存储在整数数组中。您最好的选择是创建一个同时保存类型和值的结构,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
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:作弊的答案是使用动态类型的语言。你的工作少了很多,但速度慢了,我不知道这是否是你的选择。

票数 4
EN

Stack Overflow用户

发布于 2011-03-01 21:22:29

就编译器而言,常量42'*'是相同的。在编译的对象代码中,它们都表示为整数42。

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

注意,在C++中,但在C中,有一个细微的区别:42有类型int,而'*'有类型char,所以可以使用重载函数或模板来区分这一事实。

票数 8
EN

Stack Overflow用户

发布于 2011-03-01 21:43:34

数组元素不能是简单整数。试一试:

代码语言:javascript
代码运行次数: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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5160468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档