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();