2015-09-26 49 views
0

问题出在这个函数中。它应该验证两个变量的输入为整数。我做错了什么? O__O谢谢:)代码在while循环中scanf后崩溃

我使用了一个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它用于输入B中也

+0

糟糕。我想我错过了。但是,即使它接受值,循环也不会退出:( – fixotherm

2

变化

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

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

scanf回报如果它未能分配给第一个接收参数,则为EOF。在这种情况下,如果数据被成功读入&a,它将返回1

同样,改变

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

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

谢谢。它现在接受值,但循环不会退出 – fixotherm