Эй, я попытался создать таблицу поиска, чтобы переключить символы в верхний регистр:
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 ++, комментарий для использования std :: toupper от Jarod42 — отличное предложение.
Если вы пытаетесь сделать это как C, то я верю, что ваше утверждение if неверно. Рассмотрим случай, когда c на единицу больше, чем «Z», что будет символом «[». В этом случае вы вычитаете 32, что, вероятно, не то, что вы хотели бы сделать. Я бы изменил, если сделать только диапазон нижних символов.
Кроме того, даже если ваш if выполняется, следующий оператор, следующий за блоком if, вернет символ в значение c, поэтому вам нужно добавить оператор else и блок или выполнить присваивание перед выполнением сравнения, чтобы перейти к внешнему виду. стол
Ваше условие выглядит немного странно — между «Z» и «a» есть несколько других символов — и вы перезаписываете запись в таблице сразу, когда условие выполняется. Тебе понадобится else
обрабатывать символы, которые не должны быть переведены.
if ('a' <= c && c <= 'z') {
X::lut[i] = c - 32;
}
else {
X::lut[i] = c;
}