-1

6つの機能を使用しました。そのうちの 3 つ (読み取り) はスキャン用で、残りの 1 つは印刷 (書き込み) 用です。読み取り機能が正しく動作することを確認しましたが、問題は主に書き込み機能の 1 つにあります。問題は、ユーザーから整数をスキャンし、それらを構造体の配列に格納することですが、それらを印刷するときは、最後に入力された整数のみを取得することです。

#include<stdio.h>
#include<string.h>
typedef struct
{
    char month[20];
    int day;
    int year;              
} date_t;

typedef struct{
    int hours;
    int minutes;
    int seconds;              
}time_t;

typedef struct
{
    char event[20];
    time_t tm;
    date_t dt;         
}event_t;

int wr_event(const event_t*);
int wr_date(const event_t*);
int wr_time(const event_t*);
int rd_event(event_t*);
int rd_date(event_t*);
int rd_time(event_t*);

int main()
{
    int i,j=0,temp=1;
    event_t ev[5];

    while(temp!=0&&j!=5)
    {
        rd_event(&ev[j]);
        temp=strcmp(ev[j].event,"exit");
        j++;

    }

    if(temp==0)j=j-1;

    for(i=0;i<j;i++){
        wr_event(&ev[i]);
    }

}

int rd_time(event_t *ev)
{
    printf("hours->");
    scanf("%d",&ev->tm.hours);       
    printf("minutes->");
    scanf("%d",&ev->tm.minutes);

    printf("secondes->");
    scanf("%d",&ev->tm.seconds);
}

int rd_date(event_t *ev)
{
    printf("day-> ");
    scanf("%d",&ev->dt.day);
    fflush(stdin);
    printf("month->");
    gets(ev->dt.month);

    printf("year->");
    scanf("%d",&ev->dt.year);
}

int rd_event(event_t *ev)
{

    printf("\nevent name->");
    fflush(stdin);
    gets(ev->event);
    if(strcmp(ev->event,"exit")!=0){

        rd_time(&ev);
        rd_date(&ev);

    }
}

int wr_time(const event_t *ev)
{

    printf("this is the time of the event->%d %d %d\n\n",ev->tm.hours,ev->tm.minutes,ev->tm.seconds);

}

int wr_date(const event_t *ev)
{
    printf("this the date of the event-> %d %s %d\n\n",ev->dt.day,ev->dt.month,ev->dt.year);
}

int wr_event(const event_t *ev)
{
    printf("\nthis is your event-> %s\n\n",ev->event);
    wr_time(&ev);  
    wr_date(&ev);
}
4

2 に答える 2

0

これを試してください。ポインターは変数のアドレスでもあることに注意してください。したがって、アドレスのアドレスが渡されました..これが問題の原因でした。また、scanf がどのように機能するかを見て、括弧を配置する方法を確認してください

#include <stdio.h>
#include <string.h>

typedef struct 
{ 
  char month[20]; 
  int day; 
  int year;
}date_t;

typedef struct{
  int hours;
  int minutes;
      int seconds;              
}timeT;

typedef struct
{
   char events[20];
   timeT tm;
   date_t dt;         
 }event_t;

 int wr_event(const event_t*);
 int wr_date(const event_t*);
 int wr_time(const event_t*);
 int rd_event(event_t*);
 int rd_date(event_t*);
 int rd_time(event_t*);

 void main()
 {
     int i,j=0,temp=1;
     event_t ev[5];
     char tmp;
     while(temp!=0&&j!=5)
     {
        rd_event(&ev[j]);
        temp=strcmp(ev[j].events,"exit");
        j++;

     }

     if(temp==0)j=j-1;

     for(i=0;i<j;i++){
     wr_event(&ev[i]);

    }
    printf("press any key to exit");
    scanf("%c",&tmp);

}
int rd_time(event_t *ev)
{
     printf("hours->");
     scanf("%d",&(ev->tm.hours));   
     printf("minutes->");
        scanf("%d",&(ev->tm.minutes));

     printf("secondes->");
     scanf("%d",&(ev->tm.seconds));
}
int rd_date(event_t *ev)
{
     printf("day-> ");
        scanf("%d",&(ev->dt.day));
            fflush(stdin);
     printf("month->");
        gets(ev->dt.month);

     printf("year->");
        scanf("%d",&(ev->dt.year));
}
int rd_event(event_t *ev)
{

     printf("\nevent name->");
        fflush(stdin);
     gets(ev->events);
  if(strcmp(ev->events,"exit")!=0){

     rd_time(ev);
     rd_date(ev);

     }
}
int wr_time(const event_t *ev)
{
printf("this is the time of the event->%d %d %d\n\n",ev->tm.hours,ev-  >tm.minutes,ev->tm.seconds);
}
int wr_date(const event_t *ev)
{
printf("this the date of the event-> %d %s %d\n\n",ev->dt.day,ev->dt.month,ev->dt.year);
}

int wr_event(const event_t *ev)
{
    printf("\nthis is your event-> %s\n\n",ev->events);
    wr_time(ev);  
    wr_date(ev); 
}

ユーザーが数字、数字、または文字列を入力した場合は、チェックを行う必要もあります。そうしないと、プログラムが狂ってしまいます。また、ユーザーが 20 文字を超えて入力した場合など、多くのことを確認する必要があります。ユーザーと通信するプログラムを作成するときは、有効な入力をチェックする必要があります!

于 2013-09-18T21:59:50.067 に答える