在c++中创建并初始化一个静态const char数组作为Ascii查找表
create and initialize a static const char array as Ascii Look up Table in c++
嘿,我试着做一个查找表来把字符转换成大写:
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;
}