C中的枚举和字符串

时间:2013-10-04 18:15:37

标签: c string enums

我有一个char *字符串。我需要相应地存储它。

字符串可以是任何值{UK,GD,BD,ER,WR,FL}

如果我想将它们保留为枚举类型,哪种数据类型最好使用。就像6个值一样,三位就足够了,但如何在C?中存储三位?

3 个答案:

答案 0 :(得分:4)

你想要的是Bit Field

typedef struct {
    unsigned char val : 2; //use 2 bits
    unsigned char : 6; // remaining 6 bits
} valContainer;

...

valContainer x;
x.val = GD;

请注意,实际上没有办法存储少于一个字节,因为字节的定义是计算机可以处理的最小内存量。这只是一种将名称与字节中的不同位相关联的方法。

当然,对于6个值(2位保持4个不同的值),2位是不够的。所以你真的想要至少3位(8个不同的值)。

答案 1 :(得分:1)

将它们存储为未签名的短片。除非您在结构中存储其他内容以填写整个单词,否则您将过早地进行优化。无论如何,编译器必须填写您的数据。

答案 2 :(得分:0)

正如Eric Finn所说,你可以使用位字段来存储3位的数据元素。但是,如果您还有其他东西要存储在同一个字节中,这只会很好。

struct {
    unsigned char value: 3;
    unsigned char another: 4;
    unsigned char yet_another: 5;
    // 12 bits declared so far; 4 more "padding" bits are unusable
} whatever;

如果要存储许多这样的小元素的数组,则必须以不同的方式进行,例如,在每个32位字中聚集10个元素。

int n = ...; // number of elements to store
uint32_t *data = calloc(n / 10, sizeof(*data));
for (int i = 0; i < n; i++)
{
    int value = read_string_and_convert_to_int();
    data[i / 10] &= ~(7 << (i % 10 * 3));
    data[i / 10] |= value << (i % 10 * 3);
}

如果您只想拥有一个元素(或少数元素),只需使用enumint