getchar returns 一个不同的字符

getchar returns a different character

我正在尝试使我已经通过使用函数变得更有条理的程序。它的目的是处理一个菜单,其中包含用于计算不同值的多个选项。此代码用于处理主菜单,我得到的错误是我输入的每个字符都无效(激活开关中的默认大小写),即使它是 1、2 或 3,这是可能的选项.我做错了什么?

void process_main_menu(){
int c;
print_main_menu();
int option=getchar();
while((c=getchar())!='\n' && c!=EOF);
switch(option){
        case 1:
            program_state=ST_MENU_BASS;
            break;
        case 2:
            program_state=ST_MENU_TREBLE;
            break;
        case 3:
            program_state=ST_EXIT_PROGRAM;
            break;  
        default: 
            fprintf(stderr, "%s\n", MSG_INVALID_NUMBER);
            program_state=ST_MAIN_MENU;     
    }
}

我正在更新代码,因为我发现它不够完整。我实际上为此使用了宏

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#define OPT_MENU_BASS 1
#define OPT_MENU_TREBLE 2
#define OPT_EXIT_PROGRAM 3


typedef enum {
ST_MAIN_MENU,
ST_MENU_BASS,
ST_MENU_TREBLE,
ST_EXIT_PROGRAM,
ST_MENU_TREBLE_FREQ,
ST_MENU_TREBLE_GAIN,
ST_MENU_TREBLE_FREQ_FREQ_TREBLE,
ST_MENU_TREBLE_FREQ_RESISTOR_3,
ST_MENU_TREBLE_FREQ_CAPACITOR_3,
ST_MENU_TREBLE_GAIN_RES5,
ST_MENU_BASS_FREQ,
ST_MENU_BASS_GAIN, 
ST_MENU_BASS_FREQ_FREQ_BASS,
ST_MENU_BASS_FREQ_RESISTOR_2,
ST_MENU_BASS_FREQ_CAPACITOR_1,
ST_MENU_BASS_GAIN_RESISTOR_1,
} state_t;
state_t program_state;

void process_main_menu(){
int c;
print_main_menu();
char option=getchar();
while((c=getchar())!='\n' && c!=EOF);
switch(option){
    case OPT_MENU_BASS:
        program_state=ST_MENU_BASS;
        break;
    case OPT_MENU_TREBLE:
        program_state=ST_MENU_TREBLE;
        break;
    case OPT_EXIT_PROGRAM:
        program_state=ST_EXIT_PROGRAM;
        break;  
    default: 
        fprintf(stderr, "%s\n", MSG_INVALID_NUMBER);
        program_state=ST_MAIN_MENU;     
}
}

您正在读入一个字符,例如 ,它存储为 ASCII 码,而不是数值。

您需要更改大小写以查找字符 '1',而不是数字 1

    case '1':
        program_state=ST_MENU_BASS;
        break;
    case '2':
        program_state=ST_MENU_TREBLE;
        break;
    case '3':
        program_state=ST_EXIT_PROGRAM;
        break;  

编辑:

鉴于您正在使用的宏,您需要修改宏以表示字符 '1''2''3' 而不是数字 123.

#define OPT_MENU_BASS '1'
#define OPT_MENU_TREBLE '2'
#define OPT_EXIT_PROGRAM '3'