-1

I am working on an accumulator that asks for different inputs and based on those inputs, updates values in an accumulator. My loop however, doesn't seem to run when I ask for a decimal, hexadecimal, or octal to be inputed. Could someone possibly take a look and give some suggestions to fix it? Thank you! Also Im suppose to somehow use a while loop in my print_menu() function that will check is the input is valid. Any suggestions?

#include <stdio.h>
#include <string.h>
short get_operand(char mode);
void print_acc(short acc);
char print_menu(void);
int main(void);

int main(){
  char mode = 'D';
  short acc = 8;
  char input[10];
  char option;
  char valid_input[7] = "OHDCSQ";

  while (mode != 'Q'){
      print_acc(acc);
      print_menu();
      scanf("%s", &input);
      printf("%s\n", input);
      option = (char) toupper(input[0]);

  switch(option){
      case 'O':
          mode = 'O';
          printf("mode\n");
          printf("Mode is Octal\n");
          break;

      case 'H':
          mode = 'H';
          printf("Mode is Hexadecimal\n");
          break;

      case 'D':
          mode = 'D';
          printf("Mode is Decimal\n");
          break;

      case 'C':
          acc = 0;
          break;

      case 'S':

          get_operand(mode);
          if (mode == 'H'){
              scanf("%hx", &acc);
              printf("%hx", acc);
              print_acc(acc);
          }

          else if (mode == 'O'){
              scanf("%ho", &acc);
              printf("%ho", acc);
              print_acc(acc);

          }
          else{
               scanf("%hd", &acc);
               printf("%hd", acc);
               print_acc(acc);
          }

      case 'Q':
         mode = 'Q';
         printf("\n");
         break;

    }
    //return acc;
   }


}
void print_acc(short acc){
      printf("\n");
      printf("****************************************\n");
      printf("* Accumulator:                         *\n");
      printf("*   Hex     :   %04hx                   *\n", acc);
      printf("*   Octal   :   %08ho               *\n", acc);
      printf("*   Decimal :   %06hd                      *\n", acc);
      printf("****************************************\n");

}

char print_menu(void){
      printf("\n");
      printf("Please Select one of the following options:\n");
      printf("O Octal Mode\n");
      printf("H Hecadecimal Mode\n");
      printf("D Decimal Mode\n");
      printf("\n");
      printf("C Clear Accumulator\n");
      printf("S Set Accumulator\n");
      printf("\n");
      printf("Q Quit\n");
      printf("\n");
      printf("Option: ");

}

short get_operand(char mode){
   switch(mode){
      case 'H':
          printf("Enter Hex value:");

          break;
      case 'O':
          printf("Enter Octal value:");
          break;
      default:
          printf("Enter decimal value: ");
          break;
   }
   return mode;
}
  • Step 1 `scanf("%s", &input);` --> `scanf("%9s", input);` 2) What was your input? – chux - Reinstate Monica Oct 05 '18 at 19:08
  • 1) `get_operand` should return a `char` 2) you forgot `mode = get_operand(mode)` to actually set the mode. also you forgot a break before `case 'Q'` and you can use a switch statement inside the `case 'S'` whenever that makes sense (do it after everything else works) – Ahmed Masud Oct 05 '18 at 19:08
  • Possible duplicate of [What is a debugger and how can it help me diagnose problems?](https://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me-diagnose-problems) – Raedwald Oct 06 '18 at 08:02

1 Answers1

2

In the 'S' case where you read in a number, you forget to add a break statement at the end of the case. This results in the code falling through to the Q case which causes the loop to exit.

Add the break and the loop will continue as expected:

  case 'S':
      ...
      break;
  case 'Q':
      ...

This is also incorrect:

scanf("%s", &input);

%s expects a char *, but you're passing the address of an array (a char (*)[10] to be presice). Pass in the array directly, which will decay to a pointer to the first element to yield the correct type:

scanf("%s", input);

Also, change print_menu and get_operand to return void, since you're not using the return value and in the former case failing to include one.

dbush
  • 205,898
  • 23
  • 218
  • 273