2016-10-24 5 views
2

Я пытаюсь сделать программу, которую я уже сделал более организованной с помощью функций. целью которого является обработка меню с несколькими параметрами для вычисления разных значений. Этот код предназначен для обработки главного меню, и ошибка, которую я получаю, заключается в том, что каждый символ, который я печатаю, выводится как недействительный (активирует случай по умолчанию в коммутаторе), даже если это 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;  
} 
} 
+1

Самый простой метод отладки, когда что-то идет не так, как будто это «печатать значение, которое программа действительно читает». Включите 'fprintf (stderr,« Got% d ('% c') \ n ", опция, опция);' в 'default' и вы увидите информацию, которую вы ввели' 49 ('1') ' который бы сильно намекнул на то, почему у вас есть проблема. Требуется, пожалуй, немного больше опыта, чтобы печатать как числовые, так и символьные версии значения в 'option', но со временем становится автоматическим. –

+0

Спасибо за ваше завершенное сообщение. Вы все еще не можете *** использовать '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», скорее всего, вызовет проблемы в другом месте вашего кода. –

+0

Спасибо за ваш ответ, но все эти варианты по-прежнему дают мне ту же ошибку. Я пойму это как-то – Andibadia

ответ

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; 

EDIT:

Учитывая макросы, которые вы используете, вы должны изменить макросы для представления символов '1', '2' или '3' вместо цифр 1, 2 или 3.

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

Спасибо за ответ! Ваше решение работает, но только для 2 и 3; если я набираю 1, он возвращает 2 сообщения с недопустимыми номерами. Кроме того, изначально (и как это предполагалось), заменяя числа, у которых были макросы, например OPT_MENU_BASS, назначенные значениям 1, 2 и 3, как я мог это сделать, используя это? – Andibadia

+0

Не видя больше своего кода, мы можем только предположить, что вы правильно объявляете глобальную 'program_state' и правильно определяете макросы' ST_MENU_BASS', 'ST_MENU_TREBLE',' ST_EXIT_PROGRAM'. Мы хороши, но мы не можем видеть ваш дисплей здесь ... –

+0

@Andibadia См. Мое редактирование. Вам нужно изменить макросы, чтобы использовать символьные константы, а не числовые константы. – dbush