0

My calculator app hasn't been working properly after a user inputs a number. So I added fflush(stdin) and a space after the %d in scanf(). My question is should I only include both fflush(stdin) and a space after %c or will only one of the options suffice? I'm working on a Macbook, so I'm concerned that if I leave one out it won't work on other operating systems.

#include <stdio.h> 
#include <stdlib.h> 

//PROTOTYPE
int operationSwitch(); //Function to calculate total of operand1 and operand2.
int menu(); //Function for main menu.
int iResume(); //Function to continue the program or not.


char  iOperation    = '\0'; //choices (1-7)
float operand1      = 0; //number 1
float operand2      = 0; //number 2
float operandTotal  = 0; //total

int   testPrime, counter, prime = 0; 

char cContinue   = '\0'; 
char symbol      = '\0'; 


int main(){
    menu();
return 0;
}


int menu (){

  do {
      printf("\nPlease choose an operation: ");
      printf("\n(1) Addition\n ");
      printf("\n(2) Subtraction\n ");
      printf("\n(3) Multiplication\n ");
      printf("\n(4) Division\n ");
      printf("\n(5) Modulus (integers only)\n ");
      printf("\n(6) Test if Prime (integers only)\n ");
      printf("\n(7) Exit\n ");
      printf("\nChoose (1-7):\t");
      fflush(stdin);
      scanf(" %c", &iOperation);
  } while (iOperation < 49 || iOperation > 55 );


  if (iOperation != 54 && iOperation != 55){ //ASCII 55 == 7)
    printf("\nEnter number 1:\t");
    fflush(stdin);
    scanf(" %f", &operand1);
    printf("\nEnter number 2:\t");
    fflush(stdin);
    scanf(" %f", &operand2);
  }
    operationSwitch();

  /*** RESULTS ***/
  if ( symbol == '/' && operand2 == 0) {
    printf("\n\t-----| Answer: %.2f / %.2f = Undefined |-----\n", operand1,operand2);
  } else if (iOperation != 54) {
    printf("\n\t-----| Answer: %.2f %c %.2f = %.2f |-----\n", operand1, symbol, operand2, operandTotal);
  }


      iResume();

  return 0;
} //End Menu

/*********************************
  SWITCH FUNCTION
*********************************/
int operationSwitch() {

  switch (iOperation) {
    case 49://1 Addition Ascii 49 == 1 43 == +
      operandTotal = operand1 + operand2;
      symbol = '+';
      break;

    case 50: //2 Substraction
      operandTotal = operand1 - operand2;
      symbol = '-';
      break;

    case 51: //3 Multiplication
      operandTotal = operand1 * operand2;
      symbol = '*';
      break;

    case 52: //4 Division
      operandTotal = operand1 / operand2;
      symbol = '/';
      break;

    case 53: //5 Modulus
      operandTotal = (int)operand1 % (int)operand2;
      symbol = '%';
      break;

    case 54: //6
      prime = 1;
      printf("\nEnter number to be tested for prime: ");
      fflush(stdin);
      scanf(" %d", &testPrime);

        for(counter = 2; counter <= (testPrime/2); counter++ )
        {
        if(testPrime % counter == 0)
          {
              prime = 0;
              break;
          }
        }
        if (prime == 1) {
                printf("\n\t| %d is a prime number. |\n", testPrime);
        }
        else {
            printf("\n\t| %d is not a prime number. |\n", testPrime);
            printf("\n\t| %d * %d = %d \n", testPrime/counter, counter , testPrime);
        }
      break;

    case 55:
      printf("\nGood Bye\n");
      exit(0);
      break;

    default:
      printf("\nYou entered: %c - Please try again ", iOperation );
      break;
  } //End Switch iOperation

  return 0;
} //End Switch Function

/*********************************
  RESUME FUNCTION
*********************************/
int iResume() {
  printf("\nWould you like to try again?\nPress \'Y\' to go to menu,\nor any key to quit?\t");
  fflush(stdin);
  scanf(" %c", &cContinue);

  if (cContinue == 'y' || cContinue == 'Y'){
    menu();
  } else {
    printf("Good Bye!\n" );
  }
  return 0;
}
  • Neither is ok (`fflush(stdin)` is not reliable, `scanf()` with extra space doesn't behave as usual console applications do). Use `fgets()` to get user input. – pmg Sep 06 '18 at 14:00
  • `fflush(stdin)` is wrong. Never use it. Changing `"%c"` to `" %c"` is sometimes helpful. Adding a space after `%d` is unlikely to be helpful. Not mixing `fgets` and `scanf` is very helpful. Abandoning `scanf` entirely (in favor of `fgets` and other techniques) is very helpful, but is too radical a step for many. – Steve Summit Sep 06 '18 at 14:15

1 Answers1

0

fflush(stdin) is undefiined behavior.

int fflush(FILE *ostream);

ostream points to an output stream or an update stream in which the most recent operation was not input, the fflush function causes any unwritten data for that stream to be delivered to the host environment to be written to the file; otherwise, the behavior is undefined.

cleblanc
  • 3,678
  • 1
  • 13
  • 16