嗨,我是C语言编程的新手。我正在尝试创建一个计算器。我成功地做到了这一点,但是当我尝试让程序重新开始时,用户可以提出另一个问题它无法正常工作。它看起来像这样
app:popupTheme="@style/AppTheme.PopupOverlay"
它会跳过输入的第一行,但是我输入的字符很多,它会做同样的事情。这是我的代码
Type what operation you want to do(+, -, *, /:)
*
Enter two operands:
8
8
The product of the two numbers is64
Type what operation you want to do(+, -, *, /:)
Enter two operands:
gg
Type what operation you want to do(+, -, *, /:)
Enter two operands:
Type what operation you want to do(+, -, *, /:)
Enter two operands:
现在我知道goto命令不是很好,所以如果有替代方案可行,我会对它开放。
答案 0 :(得分:1)
阅读char
后,您应该清理缓冲区。
不要use fflush(stdin)
- 这是一种不好的做法。
您可以改为添加此功能:
void clean_stdin(void)
{
int c;
do {
c = getchar();
} while (c != '\n' && c != EOF);
}
并在`scanf:
之后调用它 scanf("%c", &operator);
clean_stdin();`
关于GOTO:您可以使用循环 - 可能是while
循环或者for
循环或do … while
循环。这些比使用goto
语句和标签更容易理解。
<强>更新强>
或者,正如@BLUEPIXIE建议的那样,您可以通过以下方式更改scanf
:
scanf(" %c", &operator); // adding a space before %c
答案 1 :(得分:0)
问题实际上不是goto
语句,而是scanf("%c",...)
将消耗一个新行的事实,该行可能在先前输入的整数值之后位于缓冲区中。
假设以下代码:
int main() {
char operator;
int a;
printf("Enter an integral value:\n " );
scanf("%d",&a);
printf("Try to enter an operator (will probably be skipped):\n " );
scanf("%c", &operator);
if (operator == '\n')
printf("You entered a new line (did you?)\n");
else
printf("You entered: %c\n", operator);
return 0;
}
如果输入一个整数值并按<enter>
,则新行字符将保留在缓冲区中。随后的scanf
语句会立即使用它。所以如果你输入,例如; 19
并按<enter>
,然后您将获得以下输出:
Enter an integral value: 19
Try to enter an operator (will probably be skipped):
You entered a new line (did you?)
但是,如果您使用 - 如melpomene所建议 - 以下声明:
scanf(" %c", &operator);
然后scanf
将在第一个非空白字符实际读入%c->&operator
之前消耗任意长的空格字符序列(包括新行):
Enter an integral value:
19
Enter an operator:
+
You entered: +