2014-12-26 3 views
0

Я здесь новый, и я также новичок в языке C. У меня проблема с моим коммутатором, несмотря на то, что у меня есть значение по умолчанию. У меня есть меню с параметрами от 1 до 5, а также 0. Дело в том, что когда я запускаю программу и вводю любое число с более чем 1 цифрой, программа только считывает первую цифру и выполняет соответствующую опцию. Например, если я введу 13, программа откроет параметр номер 1, если я введу 243, программа откроет второй вариант и так далее. То же самое происходит, если я ввожу комбинацию цифр и букв, таких как 1d, 4b, 5A и т. Д.Switch - по умолчанию не работает в C

Помогите мне пожалуйста?

int main() 
{ 
    char opcao, terminar=1; /*Zona de declaração das variáveis*/ 
    MODULO mlunar; 
    MODULO *maux=NULL; 
    PONTOS *ponto=NULL, *p1=NULL; 

    do 
    {   
    printf("\n1 - Especificação dos dados do módulo e das condições iniciais do voo \n"); 
    printf("2 - Simulalção do voo em modo de cockpit \n"); 
    printf("3 - Apresentação em modo gráfico da trajectória do módulo \n"); 
    printf("4 - Definição do perfil da superfície lunar \n");      /*Imprime as opções no ecrã*/ 
    printf("5 - Simulação do voo em modo gráfico \n"); 
    printf("0 - Terminar o programa \n"); 
    printf("\nEscolha uma das opções acima indicadas, carregando no respetivo numero: "); 

    opcao=getchar(); /*Leitura da opção seleccionada*/  
    while(getchar()!='\n'){}; /*Limpar o buffer do teclado*/ 

    switch(opcao) /*Condição para cada opção selecionada*/ 
    { 
     case '1': /*Caso o utilizador carregue em '1', é invocada a função da 1ª opção e assim sucessivamente.*/ 
     maux=opcao1(&mlunar); break; 
     case '2': 
     if(maux!=NULL) 
     { 
      opcao2(&mlunar); 
     } 
     else 
     { 
      printf("\n\nOpção 1 NÃO EXECUTADA! Por favor, execute a primeira opção.\n");break; 
     } 
     case '3': 
     opcao3(mlunar); break; 
     case '4': 
     p1=opcao4(ponto); break; 
     case '5': 
     opcao5(p1); break; 
     case '0': 
     printf("\nDeseja terminar o programa? \n S/s - sim \n N/n - não \n"); 
     terminar=getchar(); /*Leitura da opção seleccionada*/  
     while(getchar()!='\n'){}; /*Limpar o buffer do teclado*/ 
     while (terminar!='s' && terminar!='S' && terminar!='n' && terminar!='N') /*O utilizador não inseriu nenhuma das opções apresentadas*/ 
     { 
      printf("\nA opção selecionada é inválida! Por favor, introduza uma opção válida.\n"); 
      terminar=getchar();  
      while (getchar()!='\n'){} 
     } 
     default: 
     printf("\nA opção selecionada não existe! Por favor, introduza uma opção que conste na lista.\n"); 
    } 
    } 
    while(terminar!= 's' && terminar!= 'S'); /*Enquanto a variavel 'terminar' nao receber um S ou s, o prorama nao terminara*/ 
    return 0; 
} 
+3

Ну, как и в первом случае, ваш 'case '2'' и' case' 0'' не имеют 'break;'. Кроме того, вам нужно проверить логику использования для 'getchar()'. –

+0

Ваша проблема: 'getchar()' он читает только один символ, который является '1' в случае' 13' и '2' в случае' 243'. Поэтому он входит в 'case '1':' и 'case '2':' not 'default:'. –

+0

Попробуйте [Переполнение стека на португальском языке] (http://pt.stackoverflow.com/) (бета). – pmg

ответ

0

Вы должны объявить opcao как int и использовать

scanf("%d",&opcao); 

вместо

opcao=getchar(); 

и switch-case будет выглядеть

switch(opcao) 
{ 
case 1://code 
    break; 
case 2://code 
    break; 
case 3://code 
    break; 
case 4://code 
    break; 
case 5://code 
    break; 
case 0://code 
    break; 
default://code 
} 

Там нет никакого способа, которым вы можете определить, введен ли пользователь больше, чем характер r путем сканирования символа. Вам нужно будет использовать int. Поскольку все ваши case s состоят из цифр, вам повезло.

+0

Почему вы предлагаете использовать 'int'? – Gopi

+0

Я пробовал свой путь, но теперь он не принимает никаких символов вообще, даже варианты. Он возвращает мне печать, которую я установил внутри значения по умолчанию. – Nikita

+0

@Gopi, зачем использовать тип данных 'char', когда мы имеем дело с числами? –

0

Вы сравниваете коды символов, а не цифры. getchar читает ровно один символ. Если вы введете номер, он будет читать ровно одну цифру (в форме как символ), поэтому независимо от того, как долго это число, только первые цифры превратят его в оператор switch. Вам нужно это исправить.

Как сделать: Замените getchar с помощью некоторой функции, которая считывает и анализирует число. в инструкции switch, не сравнивайте коды символов, а цифры.

Смежные вопросы