2015-09-26 1 views
0

Проблема в этой функции. Он должен проверять ввод двух переменных как целых чисел. Что я сделал не так? O__O Спасибо :)Сбой кода после сканирования в режиме while

Я использовал инструкцию if else, чтобы проверить изменение действующей переменной, чтобы она вышла из цикла после ввода правильного ввода. Даже если я ввожу правильные значения, код все равно падает.

void input(int *n1, int *n2, char *opt) 
{ 
    int valid = 0; 
    int v2 = 0; 
    char choice; 
    int a, b; 


    while (v2 == 0) 
    { 
     printf("Enter first number: \n"); 
     if(scanf("%d", &a) == 1) 
     { 
      while(v2 == 0) 
      { 
       printf("Enter second number: \n"); 
       if(scanf("%d", &b) == 1) 

       { 
        v2 =1; 
        getchar(); 
       } 
       else 
       { 
        getchar(); 
        printf("Invalid input!\n"); 
       } 
      } 
getchar();   
     } 
     else 
     { 
      getchar(); 
      printf("Invalid input!\n"); 
     } 
    } 



    while(valid == 0) 
    { 
     printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n"); 
     scanf("%c", &choice); 
     if (choice == 'r' || choice == 'e') 
     { 
      choice = toupper(choice); 
     } 
     if ((choice == '1') || (choice == '2') || (choice == '3') || (choice == '4') || (choice == 'R') || (choice == 'E')) 
     { 
      valid = 1; 
     } 
     else 
     { 
      printf("Invalid input!\n\n"); 
     } 
    } 
    *opt = choice; 
    *n1 = a; 
    *n2 = b; 
} 

Вот полный код для справки. Ответы ранее были в состоянии исправить аварии. Теперь либо цикл не выходит, либо работает неправильно.

#include <stdio.h> 
#include <ctype.h> 

int add(int n1, int n2); 
int subtract(int n1, int n2); 
int multiply(int n1, int n2); 
int divide(int n1, int n2); 
void input(int *n1, int *n2, char *opt); 


int main(void) 
{ 
    int n1, n2, ret; 
    char opt; 

    start: 
    input(&n1, &n2, &opt); 

    switch(opt) 
{ 
      case '1': 
       ret = add(n1, n2); 
       printf("The sum is %d\n", ret); 
       break; 
      case '2': 
       ret = subtract(n1, n2); 
       printf("The difference is %d\n", ret); 
       break; 
      case '3': 
       ret = multiply(n1, n2); 
       printf("The product is %d\n", ret); 
       break;    
      case '4': 
       ret = divide(n1, n2); 
       printf("The quotient is %d\n", ret); 
       break; 
      case 'R': 
       goto start; 
       break; 
      case 'E': 
       printf("Goodbye!\n"); 
       return 0; 
       break; 
    } 
    goto start; 
} 


void input(int *n1, int *n2, char *opt) 
{ 
    int valid = 0; 
    int v2 = 0; 
    char choice; 
    int a, b; 


    while (v2 == 0) 
    { 
     printf("Enter first number: \n"); 
     if(scanf("%d", &a) == 1) 
     { 
      while(v2 == 0) 
      { 
       printf("Enter second number: \n"); 
       if(scanf("%d", &b) == 1) 

       { 
        v2 =1; 
        getchar(); 
       } 
       else 
       { 
        getchar(); 
        printf("Invalid input!\n"); 
       } 
      } 
getchar();   
     } 
     else 
     { 
      getchar(); 
      printf("Invalid input!\n"); 
     } 
    } 



    while(valid == 0) 
    { 
     printf("Addition -> 1\nSubtraction -> 2\nMultiplication -> 3\nDivision -> 4\nReset -> R\nExit -> E\n"); 
     scanf("%c", &choice); 
     if (choice == 'r' || choice == 'e') 
     { 
      choice = toupper(choice); 
     } 
     if ((choice == '1') || (choice == '2') || (choice == '3') || (choice == '4') || (choice == 'R') || (choice == 'E')) 
     { 
      valid = 1; 
     } 
     else 
     { 
      printf("Invalid input!\n\n"); 
     } 
    } 
    *opt = choice; 
    *n1 = a; 
    *n2 = b; 
} 


int add(n1, n2) 
{ 
    int result; 
    result = (n1+n2); 
    return result; 
} 

int subtract(n1, n2) 
{ 
    int result; 
    result = (n1-n2);    
    return result; 
} 

int divide(n1, n2) 
{ 
    int result; 
    result = (n1/n2); 
    return result; 
} 

multiply(n1, n2) 
{ 
    int result; 
    result = (n1*n2); 
    return result; 
} 
+0

Вы пытаетесь запустить это в отладчике? – alk

+0

Если вы имеете в виду, например, в cmd, да. Я тоже пытаюсь выяснить это. : D – fixotherm

+0

Нет, я имею в виду использование отладчика: https://en.wikipedia.org/wiki/Debugger – alk

ответ

0

Вместо

 if(scanf("%d", a) != 0) 

Вы должны использовать

 if(scanf("%d", &a)) 

Scanf может возвращать 0,1 или EOF, из которых только 1 указывает на отсутствие ошибок при вводе! Однако, если ваш был указатель на некоторые целое число адресов места вы могли бы использовать прежнее code.Change его для ввода б а

+0

К сожалению. Кажется, я пропустил это. Но цикл не будет завершен, даже если он принимает значения :( – fixotherm

2

Изменить

if(scanf("%d", a) != 0) 

в

if(scanf("%d", &a) == 1) 
        // ^^^^ This is the right check 
      //  ^^^ Missing & 

scanf возвращения EOF, если он не может назначить первому аргументу приема. В этом случае он вернет 1, если данные были успешно прочитаны в &a.

Аналогично, изменение

  if(scanf("%d", b) != 0) 

в

  if(scanf("%d", &b) == 1) 
         // ^^^ ^^^^ 
+0

Спасибо. Теперь он принимает значение, но цикл не выйдет – fixotherm

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

  • Нет связанных вопросов^_^