You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:35:42