#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NUM_DAYS_IN_WEEK 7
typedef struct
{
char *acDayName;
int iDate;
char *acActivity;
}DAYTYPE;
void fnFreeCal(DAYTYPE *);
void fnDispCal(DAYTYPE *);
void fnReadCal(DAYTYPE *);
DAYTYPE *fnCreateCal();
int main()
{
// Create the calendar
DAYTYPE *weeklyCalendar = fnCreateCal();
// Read data from the keyboard
fnReadCal(weeklyCalendar);
// Display the week's activity details
fnDispCal(weeklyCalendar);
// Free allocated memory
fnFreeCal(weeklyCalendar);
return 0;
}
DAYTYPE *fnCreateCal()
{
DAYTYPE *calendar = (DAYTYPE *)malloc(NUM_DAYS_IN_WEEK * sizeof(DAYTYPE));
for(int i = 0; i < NUM_DAYS_IN_WEEK; i++)
{
calendar[i].acDayName = NULL;
calendar[i].iDate = 0;
calendar[i].acActivity = NULL;
}
return calendar;
}
void fnReadCal(DAYTYPE *calendar)
{
char cChoice;
for(int i = 0; i < NUM_DAYS_IN_WEEK; i++)
{
printf("Do you want to enter details for day %d [Y/N]: ", i + 1);
scanf("%c", &cChoice);
getchar();
if(tolower(cChoice) == 'n')
continue;
printf("Day Name: ");
char nameBuffer[50];
scanf("%s", nameBuffer);
calendar[i].acDayName = strdup(nameBuffer);
printf("Date: ");
scanf("%d", &calendar[i].iDate);
printf("Activity: ");
char activityBuffer[100];
scanf(" %[^\n]", activityBuffer);
calendar[i].acActivity = strdup(activityBuffer);
printf("\n");
getchar();
}
}
void fnDispCal(DAYTYPE *calendar)
{
printf("\nWeek's Activity Details:\n");
for(int i = 0; i < NUM_DAYS_IN_WEEK; i++)
{
printf("Day %d:\n", i + 1);
if(calendar[i].iDate == 0)
{
printf("No Activity\n\n");
continue;
}
printf(" Day Name: %s\n", calendar[i].acDayName);
printf(" Date: %d\n", calendar[i].iDate);
printf(" Activity: %s\n\n", calendar[i].acActivity);
}
}
void fnFreeCal(DAYTYPE *calendar)
{
for(int i = 0; i < NUM_DAYS_IN_WEEK; i++)
{
free(calendar[i].acDayName);
free(calendar[i].acActivity);
}
free(calendar);
}
这是一个将日历声明为由 7 个元素组成的数组(动态创建的数组)的程序,以表示一周中的 7 天。数组的每个元素都是具有三个字段的结构。首先 字段是日期的名称(动态分配的字符串),第二个字段是 当日日期(整数),第三个字段是活动的描述 特定的一天(动态分配的字符串)。编写函数create()、read()和display();创建日历、从键盘读取数据以及在屏幕上打印周活动详细信息报告。 这个程序中有两个getchar()方法,为什么需要getchar()呢? 还解释一下程序
它用于消耗先前输入中的尾随换行符。
与
%s
和 %d
转换说明符不同,%c
和 %[
转换说明符不会跳过前导空格,因此它们可能会错误地从先前的输入中获取换行符。如果没有 getchar
调用,第二次循环时,scanf("%c", &cChoice);
调用将从上一个活动输入中读取换行符并将其分配给 cChoice
,从而丢弃剩余的输入。
不过,有更好的方法来处理这个问题。您可以在格式字符串中使用前导空格:
scanf( " %c", &cChoice );
该前导空白将消耗所有前导空白,因此您不需要在其之前单独进行
getchar
调用。