Я пытаюсь сделать программу, которую я уже сделал более организованной с помощью функций. целью которого является обработка меню с несколькими параметрами для вычисления разных значений. Этот код предназначен для обработки главного меню, и ошибка, которую я получаю, заключается в том, что каждый символ, который я печатаю, выводится как недействительный (активирует случай по умолчанию в коммутаторе), даже если это 1, 2 или 3, которые являются возможными параметрами , Что я делаю не так?getchar возвращает другой символ
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;
}
}
Самый простой метод отладки, когда что-то идет не так, как будто это «печатать значение, которое программа действительно читает». Включите 'fprintf (stderr,« Got% d ('% c') \ n ", опция, опция);' в 'default' и вы увидите информацию, которую вы ввели' 49 ('1') ' который бы сильно намекнул на то, почему у вас есть проблема. Требуется, пожалуй, немного больше опыта, чтобы печатать как числовые, так и символьные версии значения в 'option', но со временем становится автоматическим. –
Спасибо за ваше завершенное сообщение. Вы все еще не можете *** использовать 'case OPT_MENU_BASS:' если вы делаете 'case (OPT_MENU_BASS + '0'):' потому что 'OPT_MENU_BASS' равно десятичному' 1' *** not *** character '' 1'' (который фактически десятичный '49'), или вы можете сделать' switch (option - '0') ', чтобы сделать' option' a * decimal * вместо символа *. Посмотрите внимательно, например. [** ASCII Table.com **] (http://www.asciitable.com/). В качестве альтернативы вы можете «#define OPT_MENU_BASS» 1'', но переопределение «OPT_MENU_BASS», скорее всего, вызовет проблемы в другом месте вашего кода. –
Спасибо за ваш ответ, но все эти варианты по-прежнему дают мне ту же ошибку. Я пойму это как-то – Andibadia