在c ++中创建并初始化一个静态const char数组作为Ascii Look up Table

时间:2014-05-15 13:22:58

标签: c++ initialization lookup-tables arrays

嘿,我试图制作一个查找表,将字符切换为大写:

struct X {
    static const char lut[256];
};

int main(int argc, char** argv) {
    for(int i = 0; i < 256; i++) {
        char c = (char)i;
        if (c <= 'z' && c > 'Z') {
            X::lut[i]= (c-32);  
        }
        X::lut[i]=c;
    }
    return 0;
}

我知道这是错误的方式:(有人可以告诉我这样做吗?

3 个答案:

答案 0 :(得分:0)

虽然您将问题标记为C ++,但代码似乎更符合C语言。如果您使用的是C ++,则使用Jarod42使用std :: toupper的注释是一个很好的建议。

如果您尝试将其作为C,那么我相信您的if语句不正确。考虑这样的情况,其中c只是一个大于&#39; Z&#39;,这将是&#39; [&#39;字符。在这种情况下,你减去32,这可能不是你想做的。我会改变if只做低位字符的范围。

此外,即使运行if,if块后面的下一个语句也会将字符设置回c,因此您需要添加else语句和块,或者在进行比较之前进行分配以进行更改到查询表。

答案 1 :(得分:0)

你的情况看起来有点奇怪 - 在&#39; Z&#39;之间还有其他几个字符。和&#39; a&#39; - 当条件为真时,您将立即覆盖表条目。您需要else来处理不应翻译的字符。

    if ('a' <= c && c <= 'z') {
        X::lut[i] = c - 32;  
    } 
    else { 
        X::lut[i] = c;
    }

答案 2 :(得分:0)

您可以使用以下内容(在C ++ 11中):

#include <array>
#include <cctype>

std::array<char, 256> to_upper_array()
{
    std::array<char, 256> res;

    for (int i = 0; i != 256; ++i) {
        res[i] = char(std::toupper(i));
    }
    return res;
}

struct X {
    static const std::array<char, 256> lut;
};

const std::array<char, 256> X::lut = to_upper_array();