#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 действительно бросает вас в глубокий конец без предупреждения.