C 检查它是字符还是整数

C 检查它是字符还是整数,c,char,int,C,Char,Int,这是一个整数数组: int values[] = { 75, '*', 5,'-' }; for(i=0 ; i<size ; i++){ // Here } int值[]={75',*',5',-'}; 对于(i=0;i您不能。至于编译器,常量42和'*'是一个相同的。在编译的目标代码中,它们都表示为整数42 如果需要区分整数和字符,请使用指示值类型的布尔标志或枚举,或者将整数和字符保留在单独的数组中 请注意,在C++中,但不是在C中,有一个细微的差别: 42代码>代码>类型

这是一个整数数组:

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

for(i=0 ; i<size ; i++){
    // Here
}
int值[]={75',*',5',-'};

对于(i=0;i您不能。至于编译器,常量
42
'*'
是一个相同的。在编译的目标代码中,它们都表示为整数42

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


请注意,在C++中,但不是在C中,有一个细微的差别:<代码> 42代码>代码>类型>代码> int >代码>,而代码> > * >代码>类型>代码> char < />代码>,因此可以使用重载函数或模板来区分这个事实。

下去是一条危险的道路。进入:

那么,当你看到数字42时……它是什么?它是
“*”
字符,还是你实际上指的是数字
42

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

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:作弊的答案是使用一种动态类型的语言。你的工作少很多,但速度较慢,我不知道你是否可以选择它。

你的数组元素不能是简单的整数。 请尝试以下方法:

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;
    }
}
enum ElementType{INTEGER,OPERATION};
结构阵列{
枚举元素类型etype;
综合评价;
};
结构数组元素值[]={
{INTEGER,75},{OPERATION,'*'},{INTEGER,5},{OPERATION,'-'}
};
对于(i=0;i
'-'是运算,45同时作为整数可以,但我怎么知道它的45或'-'?你不能。当你同时拥有
'-'
&
45
时,
-
的ascii值存储在数组中。因此,有两个
45
,你无法区分这两个。此外,问题中还有一个输入错误。
values
应该是一个数组。你应该问一下你真正的问题。可能你正在解析一些输入,在这种情况下,数字和运算符都是以字符序列的形式出现的,并且可以区分。我不能!!,,你的意思是没有办法绕过它吗C@Rami:解决问题的方法是重新设计代码。不要使用
int
数组,使用包含所需信息的更复杂结构。
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;
    }
}