1) Инициализируйте все ваши переменные.
int startDay, days, year, month, a;
startDay = -1;
days = -1;
В этом случае «-1» или «0» выражают значение, которое по-прежнему не имеет реального контента, предоставленного пользователем. В других случаях вы можете инициализировать «правдоподобное» действительное значение по умолчанию. Это помогает отладке. Очень некрасиво проверять значения отладки, которые являются тем мусором, который был там, когда вы создавали свою переменную.
Я не помню, позволяет ли C сделать это в одну строку, как C ++. Так или иначе, сделать инициализировать их.
2) Проверьте и подтвердите ввод пользователя.
printf("enter year: ");
scanf("%d", &year);
// Check validity of year here. If year not valid, ask again, abort, or anything.
3) Подтвердите логику вашего кода с помощью утверждений (не делайте этого, конечно, для проверки ввода пользователя; см. 2).
assert(month >= 1);
assert(month <= 12);
switch (month)
{ // ...
void printMonth (int startDay, int days)
{
assert(startDay >= 1);
assert(startDay <= 31);
assert(days >= 0);
// ...
Перепроверьте, что вы на самом деле находитесь в режиме отладки и что неудачные утверждения что-то делают вообще. Для одного исполнения просто напишите assert(0);
(я не знаю, есть ли у вас логические значения в C). Это должно провалиться.
4) Делать разные вещи в разных функциях. Запрашивать у пользователя месяц и делать с ним что-нибудь «сложное» позже - это запах кода.