#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 назови это как-нибудь по-другому.