Дни недели с переключателем и перечислением - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь создать программу с переключателем регистра и перечислением в 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 Ответ

1 голос
/ 23 марта 2019

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

К сожалению, 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("%15s", 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, а не простая ==, поэтому я больше не могу использовать коммутатор и вместо этого должен использовать цикл.

...