#c #enums #casting
#c #перечисления #Кастинг
Вопрос:
Итак, моя проблема заключается в следующем: я должен ввести число от 1 до 7, и для каждого соответствующего числа я должен напечатать букву из слова английский(e означает 1, n означает 2 и т. Д.). Вот моя идея:
#include lt;iostreamgt; using namespace std; int main() { enum eng {e='e', n='n',g,l,i,s,h} }; int x; cout lt;lt; "dati xn"; cin gt;gt; x; if (x gt;= 0 amp;amp; x lt;= 7) eng val = static_castlt;enggt;(x); cout lt;lt; x; }
я хочу, чтобы число ( x ) было преобразовано в соответствующую букву из типа eng, но преобразование возвращает мне число( если я поставлю 1, это даст мне 1, если я поставлю 2, это даст мне 2). я попытался присвоить значение char e и n в eng , чтобы посмотреть ,что произойдет, но результат тот же,я знаю, что могу использовать переключатель, но я хочу попытаться заставить это работать
Комментарии:
1. Похоже, что вместо перечисления вам нужна карта для сопоставления чисел с символами.
2. Я также предлагаю вам использовать свой инструмент переформатирования редакторов, потому что код, который вы показываете, не делает того, что предлагает отступ.
3. Почему бы просто не
const char* eng = "english";...cout lt;lt; eng[x];
сделать это ?4. В тесте
x gt;=0 amp;amp; x lt;=7
есть разовая ошибка. Если ваш диапазон равен 1-7, то используйтеx gt;= 1 amp;amp; x lt;= 7
. Если ваш диапазон 0-6, то вы используетеx gt;= 0 amp;amp; x lt; 7
. Приведенный выше пример от Алана предполагает, что вы используете 0-6. Тем не менее, это допустимо с 0-7, потому что строка содержит терминатор NUL..5. Посмотрите внимательнее на то, что вы печатаете.
Ответ №1:
Обсуждение перечислений несколько выходит за рамки вопроса, потому что перечисление-это просто неправильный инструмент здесь. Значения букв в слове "english"
не являются последовательными, а имена перечислений с именами констант нелегко доступны, поэтому перечисление не помогает сопоставить индекс с символом.
Инструментом для сопоставления индекса с символом является std::string
:
std::string english{"english"}; if (x gt;= 1 amp;amp; x lt; 8) std::cout lt;lt; english[x-1];
Ваши границы были неверны. "english"
содержит всего 7 символов, в то время как ваше состояние допускает 8 различных индексов. Поскольку индексация массива основана на нуле, но такс просит вас использовать индексацию на основе 1, вам нужно вычесть 1, чтобы получить нужный символ. Более того, это вопрос стиля, но обычно используются полуоткрытые интервалы (т. Е. [1,8)
нижняя граница включена, верхняя граница не включена).
Ответ №2:
Перечисление, которое у вас есть, не имеет значений 0, 1, … потому что вы установили » e » и «n». Это символы и имеют значения int 101 и 110 соответственно. все значения перечисления после «n» будут увеличены на 1, начиная со 110. Как уже было сказано, вам нужен какой-то массив const ( std::array
, char[]
, std::vector
, std::string
(как сказано ниже)), в который вы добавляете символы «e», «n», … в этот массив. Затем вы можете просто использовать myArray[0-6], чтобы получить соответствующий символ.