Дни недели с переключением регистра и перечислением

#c #enums #switch-statement #case

#c #перечисления #switch-инструкция #случай

Вопрос:

Я пытаюсь создать программу с переключением регистра и перечислением на C. Я хочу вставить день недели, который был задан в моих днях перечисления. Программа работает нормально, но при вводе дня недели я получаю сообщение об ошибке. Код показан ниже:

 #include <stdio.h>

int main(){

    enum days{Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};
    enum days weekDay;
    int i = 0;

    printf("Insert a week day: ");
    scanf("%s", weekDay);

    switch(weekDay){

    case Sunday:
        i=i 1;
        printf("Number of the day: %i", i);
        break;

    case Monday:
        i=i 2;
        printf("Number of the day: %i", i);
        break;

    (...)

    case Saturday:
        i=i 7;
        printf("Number of the day: %i", i);
        break;

    default:
        printf("Error. Please insert a valid week day.");
        break;

    }
  

Как я могу написать это правильно?

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

1. Я запускаю программу нормально? Успешно ли компилируется этот код без предупреждений?

2. Это scanf("%s", weekDay); приводит к появлению предупреждений, их нужно сначала прочитать. Спецификатор формата %s ожидает аргумент char* типа, но weekday имеет enum тип.

3. Вы неправильно используете scanf, извините, что у меня нет времени на полный ответ, вот несколько кратких комментариев. 1. Вы еще не понимаете типы данных в C. 2. Вы еще не понимаете scanf. 3. Возможно, вам также потребуется узнать об указателях. На вашем месте я бы избегал scanf, пока вы не узнаете больше о 1, 2 и 3.

Ответ №1:

scanf с помощью %s спецификатора выполняется поиск строк, а не enum s. Убедитесь, что вы понимаете все типы данных, с которыми работаете!

К сожалению, C на самом деле не заботится о реальных именах, которые вы присваиваете enum участникам: они предназначены только для вашего собственного использования как программиста и не могут быть доступны самой программе. Попробуйте что-то вроде этого.

 const char* names[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", NULL}; // The name of each day, in order

char buffer[16]; // A place to put the input
scanf("s", buffer); // Now `buffer` contains the string the user typed, to a maximum of 15 characters, stopping at the first whitespace

for(int i=0; names[i] != NULL; i  ){ // Run through the names
    if(strcmp(buffer, names[i]) == 0){ // Are these two strings the same?
        printf("Day number %d n", i 1); // Add one because you want to start with one, not zero
        return;
    }
}

printf("Sorry, that's not a valid day"); // We'll only get here if we didn't `return` earlier
  

Я сохранил названия дней недели в виде строк, к которым у программы есть доступ. Но для сравнения строк требуется strcmp функция, а не простая == , поэтому я больше не могу использовать switch-case и должен вместо этого использовать цикл.

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

1. Хммм… На самом деле я начинаю изучать программирование, и я выбираю язык C для этого. И я никогда не видел эту функцию ‘strcmp’. Мне нужно прочитать какой-нибудь документ об этом. Но, кстати, спасибо.

2. @EbertRodrigues Нет проблем! Строки в C немного запутанны по сравнению с большинством языков более высокого уровня, поэтому я бы рекомендовал сначала придерживаться чисел, пока вы не освоитесь с базовой структурой. Возможно, вам также будет проще начать с чего-то вроде Python: Python сильно держит вас в руках, в то время как C действительно бросает вас в глубокий конец без предупреждения.