在c++中创建并初始化一个静态const char数组作为Ascii查找表

create and initialize a static const char array as Ascii Look up Table in c++

本文关键字:数组 char const 静态 查找 Ascii 一个 创建 c++ 初始化      更新时间:2023-10-16

嘿,我试着做一个查找表来把字符转换成大写:

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

我知道这是错误的方式:(有人能告诉我怎么做正确吗?

您可以使用以下命令(在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();

当您将问题标记为c++时,代码似乎更符合C。如果您正在使用c++,则Jarod42使用std::toupper的注释是一个很好的建议。

如果你试图做它作为C,那么我相信你的If语句是不正确的。考虑c只比'Z'大1的情况,'Z'就是'['字符。在这种情况下,你要减去32这可能不是你想做的。我会把if改成只处理小写字符的范围。

此外,即使运行了if语句,if语句块之后的下一条语句也会将字符设置回c,因此您需要添加else语句和语句块,或者在进行比较以更改查找表之前进行赋值操作。

您的条件看起来有点奇怪—在'Z'和'a'之间还有几个其他字符—当条件为真时,您立即覆盖了表项。您将需要一个else来处理不应该翻译的字符。

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