使用goto时程序运行不同

时间:2017-05-06 18:51:20

标签: c scanf

嗨,我是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命令不是很好,所以如果有替代方案可行,我会对它开放。

2 个答案:

答案 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: +