【问题标题】:C error while using enum constants使用枚举常量时出现 C 错误
【发布时间】:2012-03-19 09:28:51
【问题描述】:

我想编写一个函数,该函数将接受一个表示十六进制数字的字符串并将其转换为整数,我想将十六进制数字放入枚举中,但是当我使用枚举中的元素时出现错误编译时。

代码如下:

#include <stdio.h>

int htoi (char h[]);
enum HexDigits {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F};

int main () {
    enum HexDigits h = 9;
    
    return 0;
}

int htoi (char h[]) {
    
}

这是我得到的错误:

C:\Users\KiKo-SaMa\Desktop\C>gcc hello.c -o hello

hello.c:4:17: 错误:数字常量之前的预期标识符

我正在做的事情可能有什么问题?

【问题讨论】:

  • 枚举应该包含标识符。数字 0,1,...9 - 不是标识符。标识符应包含数字、字母和_,但不能以数字开头。

标签: c enums hex decimal


【解决方案1】:

枚举的作用是将符号名称分配给本质上是整数的东西,默认情况下从索引 0 开始。例如;

enum BoolValue { FALSE, UNKNOWN, TRUE };

基本上做一些接近;

const int FALSE   = 0;
const int UNKNOWN = 1;
const int TRUE    = 2;

您的问题是您试图将数字而不是符号名称放入枚举中,这很有意义,如果您将其重写为本质上会出错;

const int 0 = 0;
const int 1 = 1;

...等等。

我不确定枚举是否可以解决您要解决的问题。

【讨论】:

  • 谢谢,看来我必须按照 Mario 的建议使用,将十六进制数字放入 char 数组中并使用索引来选择我想要的数字
【解决方案2】:

使用这样的枚举定义是不正确的,应该是这样的

enum Hex
    {       
        ZERO = 0,
        ONE = 1,
        A = 10,
        B = 11,
    };

如果您的问题是将字符串转换为 int 使用 atoi

【讨论】:

  • 它应该在一个字符串中取一个十六进制数字并将其转换为一个 int,我正在解决它作为 K&R C Programming book 中的一个练习
【解决方案3】:

枚举成员必须被命名,并且他们的名字(像任何其他名字一样)不允许以数字开头。如果你想使用数字,你必须在前面添加一些东西,例如字母或下划线(例如 H0_0)。

另外,作为附加建议,只需将有效字符添加到字符串中,然后使用 strchr() 进行转换会更容易:

const char *hexchars = "0123456789ABCDEF";

// this takes a single hex character and returns its decimal representation (or -1 in case of an invalid character)
int hex_to_dec(char h) { return strchr(hexchars, h) ? strchr(hexchars, h) - hexchars : -1; }

还请注意,您不妨只使用数字常量的十六进制表示:0x00x1、...0xF

【讨论】:

  • 谢谢马里奥,就是你说的,我要用char数组,最合适了
【解决方案4】:

使用strtol() 转换任何基数为 2-36 的字符串。

strtol(const char *nptr, char **endptr, int base)

Base 0 是一种特殊情况,它接受 base 16 的“0x”前缀、8 的“0”前缀和 10 的无前缀。

char a[5]="0x0a";
char b[3]="0b";
printf ("%li\n",strtol(a,NULL,0));
printf ("%li\n",strtol(b,NULL,16));

请参阅man page 了解更长的错误检查示例。

【讨论】:

    【解决方案5】:
    enum HexDigits h = 9; // assigning numerical 9 or enum variable
    

    本例中的 9 可以作为数字 9 和枚举 HexDigits 中的“9”。

    枚举定义中使用的变量应遵循语言的变量命名约定。只允许有效的变量名。

    但是为什么你必须定义枚举? c++ 自己不支持十六进制数吗?

    MSDN page查看有关枚举的信息

    【讨论】:

    • 感谢 Rohit,但我使用的是 C,而不是 C++,我认为 C 确实支持十六进制数字,但我这样做是作为 K&R C Programming book 练习的一部分跨度>
    • 你的意思是你从教科书的例子?
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    相关资源
    最近更新 更多