Существует ли какой-либо возможный способ ввода данных пользователем в случае перечисления типа данных

#c

Вопрос:

Итак, это мой код

 #include <stdio.h>
int main()
{
    enum Month
    {
        January,
        February,
        March,
        April,
        May,
        June,
        July,
        August,
        September,
        October,
        November,
        December
    };
    char m1, m2;
    enum Month Month1, Month2;
    printf("Enter the first month: ");
    scanf("%s", amp;m1);
    printf("nEnter the second month: ");
    scanf(" %s", amp;m2);
 

Итак, здесь я ввел данные пользователя в строковую переменную, а затем попытался выполнить типизацию, но это не сработало.

     Month1 = (enum)m1;
    Month2 = enum m2;
    printf("Difference between 2 months in a year is : %d month.n", Month2 - Month1);
}
 

Есть ли какой-нибудь способ сделать это? Заранее спасибо.

Комментарии:

1. enum s в значительной степени являются просто именованными целыми числами в C.

2. Да, я это знаю. Я думал, что типография справится с этой задачей.

3. scanf("%s", amp;m1); Вы не можете прочитать строку в один символ.

4. Вам нужно понимать, что C-это язык гораздо более низкого уровня, чем, например, Java или C#, и для вас ничего подобного не происходит автоматически, например, поиск значения перечисления на основе его строкового имени.

Ответ №1:

enum а также имена переменных существуют исключительно для целей программиста. Пользователь не знает о них и не должен беспокоиться о них. Аналогично, компилятор удалит все именованные элементы в конечном двоичном исполняемом файле.

Поэтому нет никакого смысла принимать перечисление в качестве входных данных, поскольку перечисление-это просто способ для программиста легче отслеживать числа, используемые в их собственной программе. Это не служит никакой другой цели.

Вместо этого вам следует принять входные данные за правильную строку, а затем сверить их со списком используемых строк strcmp .

Ответ №2:

Вы не можете привести строку в имя константы перечисления, чтобы получить эту константу перечисления. То, что вы действительно делаете, — это принуждение адреса строки в качестве индекса перечисления, что является неопределенным поведением.

Вы могли бы написать функцию для его отображения:

 enum Month fromString (char *str)
{
    if(strcmp(str, "January") == 0)
    { 
        return January;
    }
    // and so on..
}
 

Комментарии:

1. declaration is incompatible with previous "fromString"

2. @RawNewton назови это как-нибудь по-другому.