C语言日程管理程序中getchar()函数的作用及必要性分析
每周日程管理C程序中两处getchar()的作用分析
程序代码
#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(); // 第一处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(); // 第二处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); }
两处getchar()的作用与必要性分析
第一处:scanf("%c", &cChoice);之后的getchar()
用户输入Y/N并按下回车键时,输入缓冲区会留下两个字符:用户选择的Y/N,以及换行符\n。scanf("%c", &cChoice)只会读取Y/N这个有效字符,剩下的换行符会残留在缓冲区中。如果不清除这个换行符,下一次循环执行scanf("%c", &cChoice)时,会直接读取残留的换行符,导致程序跳过用户输入、直接判定为非Y选项,出现逻辑错误。这个getchar()的作用就是清除输入缓冲区中残留的换行符,保证下一次循环能正常读取用户的选择。
第二处:输入活动后的getchar()
输入活动时,scanf(" %[^\n]", activityBuffer)的格式串开头有空格,会跳过前导空白(包括输入日期后残留的换行符),然后读取到换行前的所有字符(支持带空格的活动描述)。但用户输入完活动按下回车后,这个换行符会再次残留在缓冲区中。如果不清除,下一轮循环的scanf("%c", &cChoice)会直接读取这个换行符,同样导致跳过用户选择的问题。所以这个getchar()的作用也是清除输入缓冲区中残留的换行符,确保下一轮输入流程正常。
内容的提问来源于stack exchange,提问作者Swathi A
相关产品推荐
相关产品推荐

