示例:改进日程提醒程序 原有的日程提醒程序采用二维数组存储提醒信 息,固定长度的行浪费了空间 ■改进后的程序将采用一维数组,其元素为指向 动态分配字符串的指针 动态分配方案的优点: 必节省空间 删除某条提醒很简单 仅需对原有代码中的8行进行改进(以粗体显示), 代价不大
示例:改进日程提醒程序 原有的日程提醒程序采用二维数组存储提醒信 息,固定长度的行浪费了空间 改进后的程序将采用一维数组,其元素为指向 动态分配字符串的指针 动态分配方案的优点: 节省空间 删除某条提醒很简单 仅需对原有代码中的8行进行改进(以粗体显示), 代价不大 11
改进日程提醒程序源代码part1 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX REMIND 50 /maximum number of reminders * #define MSG LEN 60 /max length of reminder message */ int read_line(char str[],int n); int main(void){ char *reminders[MAX_REMIND]; char day_str[3],msg_str[MSG_LEN+1]; int day,i,j,num_remind 0; for (;){ if (num_remind =MAX_REMIND){ printf("--No space left --\n"); break; ) 12
改进日程提醒程序源代码 part1 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_REMIND 50 /* maximum number of reminders */ #define MSG_LEN 60 /* max length of reminder message */ int read_line(char str[], int n); int main(void) { char *reminders[MAX_REMIND]; char day_str[3], msg_str[MSG_LEN+1]; int day, i, j, num_remind = 0; for (;;) { if (num_remind == MAX_REMIND) { printf("-- No space left --\n"); break; } 12
改进日程提醒程序源代码part2 printf("Enter day and reminder:") scanf("%2d",&day); if (day ==0)break; sprintf(day_str,"%2d",day); read_line(msg_str,MSG_LEN); for (i=0;i<num_remind;i++) if (strcmp(day_str,reminders[i])<0)break; for (j num_remind;j>i;j--) reminders[j]reminders[j-1]; reminders[i]malloc(2 strlen(msg_str)+1); if (reminders[i]==NULL){ printf("--No space left --\n"); break; } strcpy(reminders[i],day_str); strcat(reminders[i],msg_str); num_remind++; )
改进日程提醒程序源代码 part2 printf("Enter day and reminder: "); scanf("%2d", &day); if (day == 0) break; sprintf(day_str, "%2d", day); read_line(msg_str, MSG_LEN); for (i = 0; i < num_remind; i++) if (strcmp(day_str, reminders[i]) < 0) break; for (j = num_remind; j > i; j--) reminders[j] = reminders[j-1]; reminders[i] = malloc(2 + strlen(msg_str) + 1); if (reminders[i] == NULL) { printf("-- No space left --\n"); break; } strcpy(reminders[i], day_str); strcat(reminders[i], msg_str); num_remind++; } 13
改进日程提醒程序源代码part3 printf("\nDay Reminder\n"); for (i=0;i<num remind;i++) printf("%s\n",reminders[i]); return 0; ) int read_line(char str[],int n){ int ch,i=0; while ((ch getchar())!='\n') if (i<n) str[i++]ch; str[i]'\0'; return i; 14
改进日程提醒程序源代码 part3 printf("\nDay Reminder\n"); for (i = 0; i < num_remind; i++) printf(" %s\n", reminders[i]); return 0; } int read_line(char str[], int n) { int ch, i = 0; while ((ch = getchar()) != '\n') if (i < n) str[i++] = ch; str[i] = '\0'; return i; } 14
动态分配的数组 动态分配数组和动态分配字符串有相似的优点 数组和指针之间的紧密关系使得动态分配的数 组像常规数组一样易用 虽然malloc可以分配数组,但calloci函数具有初 始化功能,更好用 ■realloci函数使得分配的数组可以增长和收缩 15
动态分配的数组 动态分配数组和动态分配字符串有相似的优点 数组和指针之间的紧密关系使得动态分配的数 组像常规数组一样易用 虽然malloc可以分配数组,但calloc函数具有初 始化功能,更好用 realloc函数使得分配的数组可以增长和收缩 15