getchar返回一个不同的字符

时间:2016-10-24 02:47:26

标签: c getchar

我试图制作一个程序,我已经通过使用函数使其更有条理。它的目的是处理一个菜单,其中包含几个用于计算不同值的选项。此代码用于处理主菜单,我得到的错误是我输入的每个字符都是无效的(激活交换机中的默认情况),即使它是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;     
}
}

1 个答案:

答案 0 :(得分:4)

您正在读取一个字符,例如存储为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'