嘿,我试图制作一个查找表,将字符切换为大写:
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;
}
我知道这是错误的方式:(有人可以告诉我这样做吗?
答案 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();