C 变量不更新,而循环不工作

C 变量不更新,而循环不工作,c,while-loop,switch-statement,hex,octal,C,While Loop,Switch Statement,Hex,Octal,我正在处理一个累加器,它要求不同的输入,并根据这些输入更新累加器中的值。然而,当我要求输入十进制、十六进制或八进制时,我的循环似乎没有运行。有没有人可以看一看并提出一些建议来解决这个问题?非常感谢。另外,我想在print_menu()函数中使用一个while循环来检查输入是否有效。有什么建议吗 #include <stdio.h> #include <string.h> short get_operand(char mode); void print_acc(short

我正在处理一个累加器,它要求不同的输入,并根据这些输入更新累加器中的值。然而,当我要求输入十进制、十六进制或八进制时,我的循环似乎没有运行。有没有人可以看一看并提出一些建议来解决这个问题?非常感谢。另外,我想在print_menu()函数中使用一个while循环来检查输入是否有效。有什么建议吗

#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;
}
#包括
#包括
短get_操作数(字符模式);
作废打印附件(简称附件);
字符打印菜单(无效);
int main(无效);
int main(){
字符模式='D';
短acc=8;
字符输入[10];
字符选项;
字符有效_输入[7]=“OHDCSQ”;
而(模式!=“Q”){
打印附件(acc);
打印菜单();
scanf(“%s”,&input);
printf(“%s\n”,输入);
选项=(char)toupper(输入[0]);
开关(选件){
案例“O”:
模式='O';
printf(“模式\n”);
printf(“模式为八进制\n”);
打破
案例“H”:
模式='H';
printf(“模式为十六进制\n”);
打破
案例“D”:
模式='D';
printf(“模式为十进制\n”);
打破
案例“C”:
acc=0;
打破
案例S:
获取操作数(模式);
如果(模式=='H'){
扫描频率(“%hx”、&acc);
printf(“%hx”,acc);
打印附件(acc);
}
否则如果(模式='O'){
scanf(“%ho”、&acc);
printf(“%ho”,acc);
打印附件(acc);
}
否则{
扫描频率(“%hd”和“acc”);
printf(“%hd”,acc);
打印附件(acc);
}
案例‘Q’:
模式='Q';
printf(“\n”);
打破
}
//返回acc;
}
}
无效打印附件(短附件){
printf(“\n”);
printf(“*********************************************************\n”);
printf(“*累加器:*\n”);
printf(“*十六进制:%04hx*\n”,acc);
printf(“*八进制:%08ho*\n”,acc);
printf(“*十进制:%06hd*\n”,acc);
printf(“*********************************************************\n”);
}
字符打印菜单(无效){
printf(“\n”);
printf(“请选择以下选项之一:\n”);
printf(“O八进制模式\n”);
printf(“H Hecadecimal Mode\n”);
printf(“D十进制模式\n”);
printf(“\n”);
printf(“C清除累加器\n”);
printf(“S Set累加器\n”);
printf(“\n”);
printf(“Q退出\n”);
printf(“\n”);
printf(“选项:”);
}
短get_操作数(字符模式){
开关(模式){
案例“H”:
printf(“输入十六进制值:”);
打破
案例“O”:
printf(“输入八进制值:”);
打破
违约:
printf(“输入十进制值:”);
打破
}
返回模式;
}

'S'
案例中,当您读入一个数字时,您忘记在案例末尾添加一个
break
语句。这会导致代码进入
Q
情况,从而导致循环退出

添加
中断
,循环将按预期继续:

  case 'S':
      ...
      break;
  case 'Q':
      ...
这也是不正确的:

scanf("%s", &input);
%s
需要一个
char*
,但您正在传递数组的地址(一个
char(*)[10]
为presice)。直接传入数组,该数组将衰减为指向第一个元素的指针,以生成正确的类型:

scanf("%s", input);

另外,更改
print_menu
get_operator
以返回
void
,因为您没有使用返回值,并且在前一种情况下没有包含返回值。

在读取数字的
'S'
情况下,您忘记在案例末尾添加
break
语句。这会导致代码进入
Q
情况,从而导致循环退出

添加
中断
,循环将按预期继续:

  case 'S':
      ...
      break;
  case 'Q':
      ...
这也是不正确的:

scanf("%s", &input);
%s
需要一个
char*
,但您正在传递数组的地址(一个
char(*)[10]
为presice)。直接传入数组,该数组将衰减为指向第一个元素的指针,以生成正确的类型:

scanf("%s", input);
另外,更改
print_menu
get_operator
以返回
void
,因为您没有使用返回值,并且在前一种情况下没有包含返回值。

步骤1
scanf(“%s”,&input)-->
scanf(“%9s”,输入)2)您的输入是什么?1)
获取操作数
应该返回一个
字符
2)您忘记了
模式=获取操作数(模式)
来实际设置模式。此外,您还忘记了在
案例“Q”之前有一个中断
,只要有意义(在其他一切正常后执行),您就可以在
案例“Q”中使用switch语句,这可能会重复步骤1
scanf(“%S”,&input)-->
scanf(“%9s”,输入)2)您的输入是什么?1)
获取操作数
应该返回一个
字符
2)您忘记了
模式=获取操作数(模式)
来实际设置模式。此外,您还忘记了在
case'Q'
之前的一个中断,并且您可以在
case'S'
中使用switch语句,只要这有意义(在所有其他操作都正常后执行)就可以复制