【问题标题】:Variable not Updating, While Loop not working变量未更新,While 循环不起作用
【发布时间】:2019-03-11 07:56:46
【问题描述】:

我正在开发一个累加器,它要求不同的输入,并根据这些输入更新累加器中的值。然而,当我要求输入十进制、十六进制或八进制时,我的循环似乎没有运行。有人可以看看并提出一些建议来解决它吗?谢谢!我还想以某种方式在我的 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;
}

【问题讨论】:

  • 第 1 步 scanf("%s", &amp;input); --> scanf("%9s", input); 2) 你的意见是什么?
  • 1) get_operand 应该返回一个 char 2) 你忘记了 mode = get_operand(mode) 来实际设置模式。您还忘记了在case 'Q' 之前的休息时间,并且您可以在有意义的情况下在case 'S' 中使用switch 语句(在其他一切正常后执行)

标签: c while-loop switch-statement hex octal


【解决方案1】:

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

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

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

这也是不正确的:

scanf("%s", &input);

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

scanf("%s", input);

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

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2019-03-05
    • 2020-08-20
    • 2017-06-28
    • 2013-10-14
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多