【问题标题】:Check either its a char or an integer检查它的字符或整数
【发布时间】:2011-03-01 21:18:38
【问题描述】:

这是一个整数数组:

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

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

如何检查values[i]是整数还是运算??

可能值等于一个操作的Ascii,这种情况如何处理??

【问题讨论】:

  • '-'是运算和45同时是整数
  • 好的,但我怎么知道它的 45 或 '-' ??
  • 你不能。当您同时拥有'-'45 时,- 的 ascii 值将存储在数组中。所以,有两个45,你无法区分两者。此外,问题中有一个错字。 values 应该是一个数组。
  • 您应该询问您的真正问题。假设您正在解析一些输入,在这种情况下,数字和运算符都是字符序列的形式并且可以区分。

标签: c char int


【解决方案1】:

你不能。至于编译器,常量42'*' 是一回事。在编译的目标代码中,它们都表示为整数 42。

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

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

【讨论】:

  • 我不能!!,,你的意思是没有办法绕过它??在C中
  • @Rami:解决这个问题的方法是重新设计你的代码。不要使用int 的数组,使用包含您需要的信息的更复杂的结构。
【解决方案2】:

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

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

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

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

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:作弊的答案是使用动态类型的语言。您的工作量要少得多,但速度较慢,我不知道这是否适合您。

【讨论】:

    【解决方案3】:

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

    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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 2020-08-07
      • 2023-03-22
      • 2022-12-07
      • 2020-06-27
      • 1970-01-01
      • 2016-03-20
      • 2013-04-03
      • 2016-04-06
      相关资源
      最近更新 更多