变量不更新,而循环不工作
Variable not Updating, While Loop not working
我正在研究一个要求不同输入的累加器,并根据这些输入更新累加器中的值。但是,当我要求输入十进制、十六进制或八进制时,我的循环似乎没有 运行。有人可以看一下并提出一些修复建议吗?谢谢!我还想以某种方式在我的 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;
}
在读入数字的'S'
案例中,忘记在案例末尾添加break
语句。这导致代码 落入 到导致循环退出的 Q
情况。
添加 break
并且循环将按预期继续:
case 'S':
...
break;
case 'Q':
...
这也是不正确的:
scanf("%s", &input);
%s
期望 char *
,但您传递的是数组的地址(char (*)[10]
是 presice)。直接传入数组,这将衰减到指向第一个元素的指针以产生正确的类型:
scanf("%s", input);
此外,将 print_menu
和 get_operand
更改为 return void
,因为您没有使用 return 值并且在前一种情况下失败包括一个。
我正在研究一个要求不同输入的累加器,并根据这些输入更新累加器中的值。但是,当我要求输入十进制、十六进制或八进制时,我的循环似乎没有 运行。有人可以看一下并提出一些修复建议吗?谢谢!我还想以某种方式在我的 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;
}
在读入数字的'S'
案例中,忘记在案例末尾添加break
语句。这导致代码 落入 到导致循环退出的 Q
情况。
添加 break
并且循环将按预期继续:
case 'S':
...
break;
case 'Q':
...
这也是不正确的:
scanf("%s", &input);
%s
期望 char *
,但您传递的是数组的地址(char (*)[10]
是 presice)。直接传入数组,这将衰减到指向第一个元素的指针以产生正确的类型:
scanf("%s", input);
此外,将 print_menu
和 get_operand
更改为 return void
,因为您没有使用 return 值并且在前一种情况下失败包括一个。