我应该在scanf()中包含fflush(stdin)和空格,还是只有其中一个就足够了? [重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

用户输入数字后,我的计算器应用程序无法正常工作。所以我在scanf()中添加了fflush(stdin)和%d之后的空格。我的问题是,我应该只包括fflush(stdin)和%c之后的空格还是只有其中一个选项就足够了?我正在研究Macbook,所以我担心如果我把它留下来,它将无法在其他操作系统上运行。

#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;
}
c function shared-libraries
1个回答
0
投票

fflush(stdin)是未定义的行为。

int fflush(FILE * ostream);

ostream指向输入流或未输入最近操作的更新流,fflush函数导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。

© www.soinside.com 2019 - 2024. All rights reserved.