C++ 在c+;中创建静态常量字符数组并将其初始化为Ascii查找表+;

C++ 在c+;中创建静态常量字符数组并将其初始化为Ascii查找表+;,c++,initialization,lookup-tables,arrays,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);

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

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;
}
struct X{
静态常量字符lut[256];
};
int main(int argc,字符**argv){
对于(int i=0;i<256;i++){
char c=(char)i;
if(c'Z'){
X::lut[i]=(c-32);
}
X::lut[i]=c;
}
返回0;
}

<>我知道这是错误的方式:(有人能告诉我做正确吗?< /p> < p>你把问题标注为C++,代码看起来更符合C.,如果你使用C++,那么使用STAR::TouDe4:JouD42的注释是一个很好的建议。

如果你想把它作为C来做,那么我相信你的if语句是不正确的。考虑C是一个大于z的例子,它是'[字符]。在这种情况下,你减去32,这可能不是你想做的。我会改变if做范围内的低级字符。< /P>


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

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

    if ('a' <= c && c <= 'z') {
        X::lut[i] = c - 32;  
    } 
    else { 
        X::lut[i] = c;
    }
if('a'您可以使用以下命令(在C++11中):

#包括
#包括
std::数组到上层数组()
{
std::数组res;
对于(int i=0;i!=256;++i){
res[i]=char(std::toupper(i));
}
返回res;
}
结构X{
静态常量std::数组lut;
};
常量std::array X::lut=to_upper_array();

您可以使用感谢帮助我修复了if语句。但是我知道我得到了“main.cpp:29:19:error:只读变量不可赋值”作为错误。我如何用我的值初始化静态数组?@user3640965删除
常量
。没有办法用常量数组执行此操作吗?顺便说一句,当我删除常量时,我得到以下错误:“架构x86的未定义符号:”X::lut“,引用自:\u main in main.o ld:symbol(s)找不到体系结构x86\u 64 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)“您可以将
c-32
替换为
c-'a'+'a'
#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();