инициализация — создание и инициализация статического массива const char как Ascii Look up Table в Stack Overflow

Эй, я попытался создать таблицу поиска, чтобы переключить символы в верхний регистр:

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

Решение

Вы можете использовать следующее (в 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();
0

Другие решения

В то время как у вас есть вопрос, помеченный как C ++, кажется, что код больше соответствует C. Если вы используете C ++, комментарий для использования std :: toupper от Jarod42 — отличное предложение.

Если вы пытаетесь сделать это как C, то я верю, что ваше утверждение if неверно. Рассмотрим случай, когда c на единицу больше, чем «Z», что будет символом «[». В этом случае вы вычитаете 32, что, вероятно, не то, что вы хотели бы сделать. Я бы изменил, если сделать только диапазон нижних символов.

Кроме того, даже если ваш if выполняется, следующий оператор, следующий за блоком if, вернет символ в значение c, поэтому вам нужно добавить оператор else и блок или выполнить присваивание перед выполнением сравнения, чтобы перейти к внешнему виду. стол

0

Ваше условие выглядит немного странно — между «Z» и «a» есть несколько других символов — и вы перезаписываете запись в таблице сразу, когда условие выполняется. Тебе понадобится else обрабатывать символы, которые не должны быть переведены.

    if ('a' <= c && c <= 'z') {
X::lut[i] = c - 32;
}
else {
X::lut[i] = c;
}
0
По вопросам рекламы [email protected]