C言語の構造体の使い方について　コードの指摘お願いします


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

[code]

    #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;
    }
    
[/code]




printdate(p);ではポインターではなく、値を渡しますので、もし、printdateの中で、読み込んだ値をtomorrowに渡したいのであれば、ポインターを渡す必要があります。printdate(&p);となります。

