以下のコードは入力された年月日を表示するprintdate関数と、入力された年月日の次の日を返すtomorrow関数です。このコードを実行すると間違った値(それもアドレスのような値)を返してしまいます。おそらく、構造体の使い方が間違っていると思うのですがつまってしまいました。コードを正常に動かせるよう指摘お願いします。

#include <stdio.h>

struct date{
  int year, month, day;
};

void printdate(struct date p){
  scanf("Today is %d %d %d", &(p.year), &(p.month), &(p.day));
  if(p.month<10){
    if(p.day<10){
      printf("Today is %d/%02d/%02d\n", p.year, p.month, p.day);
    }else{
      printf("Today is %d/%02d/%d\n", p.year, p.month, p.day);
    }
  }else if(p.day<10){
     printf("Today is %d/%d/%02d\n", p.year, p.month, p.day);
  }else{
    printf("Today is %d/%d/%d\n", p.year, p.month, p.day);
  }
}

struct date tomorrow(struct date p){
  if(p.month==1 || 3 || 5 || 7 || 8 || 10 || 12){
    if(p.day==31){
      p.month+=1;
      p.day=1;
    }else{
      p.day+=1;
    }
  }else if(p.month == 2){
    if((p.year%4==0 && p.day==29) || (p.year%4!=0 && p.day==28)){
      p.month+=1;
      p.day=1;
    }else{
      p.day+=1;
    }
  }else{
    if(p.day==30){
      p.month+=1;
      p.day=1;
    }else{
      p.day+=1;
    }
  }
  return p;
}

int main(){
  struct date p;
  printdate(p);
  tomorrow(p);
  printf("Tomorrow is %04d/%02d/%02d\n", p.year, p.month, p.day); 
  return 0;
}