下面的程序中getchar()有什么用

问题描述 投票:0回答:1
#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()呢? 还解释一下程序

c string ubuntu pointers getchar
1个回答
0
投票

它用于消耗先前输入中的尾随换行符。

%s
%d
转换说明符不同,
%c
%[
转换说明符不会跳过前导空格,因此它们可能会错误地从先前的输入中获取换行符。如果没有
getchar
调用,第二次循环时,
scanf("%c", &cChoice);
调用将从上一个活动输入中读取换行符并将其分配给
cChoice
,从而丢弃剩余的输入。

不过,有更好的方法来处理这个问题。您可以在格式字符串中使用前导空格:

scanf( " %c", &cChoice );

该前导空白将消耗所有前导空白,因此您不需要在其之前单独进行

getchar
调用。

© www.soinside.com 2019 - 2024. All rights reserved.