C 为什么我的程序在给定不正确的输入时会无限次地计算结果或计算不正确的次数?

C 为什么我的程序在给定不正确的输入时会无限次地计算结果或计算不正确的次数?,c,loops,infinite,C,Loops,Infinite,此程序中的默认输入为“数字运算符”fe。"43 +". 当我输入一个字母而不是一个数字,或者输入两个或更多的字母而不是一个运算符时,它会无限地产生结果,而当我确定它只会产生一个无意义的结果并停止 当我输入两个(或更多)运算符而不是一个fe时。“--”它确实运行计算两次(或更多)。保存运算符的变量是char,因此只应接受一个运算符 我想知道为什么会发生这种情况。至少到目前为止,我正在使用的书中没有解释这一点 完整代码如下 #include <stdio.h> int main (vo

此程序中的默认输入为“数字运算符”fe。"43 +". 当我输入一个字母而不是一个数字,或者输入两个或更多的字母而不是一个运算符时,它会无限地产生结果,而当我确定它只会产生一个无意义的结果并停止

当我输入两个(或更多)运算符而不是一个fe时。“--”它确实运行计算两次(或更多)。保存运算符的变量是char,因此只应接受一个运算符

我想知道为什么会发生这种情况。至少到目前为止,我正在使用的书中没有解释这一点

完整代码如下

#include <stdio.h>

int main (void)
{
    float number;
    char operator;
    _Bool terminate = 0;
    float accumulator = 0;

    printf ("Begin Calculations\n");

    while (terminate == 0) {
        scanf ("%f %c", &number, &operator);
        printf ("number %.6f      operator %c\n", number, operator);

        if (operator == '+') {
            accumulator += number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '-') {
            accumulator -= number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '*') {
            accumulator *= number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '/') {
            if (number == 0) {
                printf ("You can't divide by zero.\n");
            }    
            else {
                accumulator /= number;
                printf ("= %.6f\n", accumulator);
            }
        }
        else if (operator == 'S') {
            accumulator = number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == 'E') {
            printf ("= %.6f\nEnd of Calculations.\n", accumulator);
            terminate = 1;
        }
        else {
            printf ("Unknown operator.\n");
        }    
    } 
return 0;    
}
#包括
内部主(空)
{
浮点数;
字符算子;
_布尔终止=0;
浮动累加器=0;
printf(“开始计算”);
while(终止==0){
scanf(“%f%c”、&编号和运算符);
printf(“编号%.6f运算符%c\n”,编号,运算符);
if(运算符=='+'){
累加器+=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='-'){
累加器-=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='*'){
累加器*=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='/')){
如果(数字==0){
printf(“不能被零除。\n”);
}    
否则{
累加器/=数字;
printf(“=%.6f\n”,累加器);
}
}
else if(运算符='S'){
累加器=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符='E'){
printf(“=%.6f\n计算次数。\n”,累加器);
终止=1;
}
否则{
printf(“未知运算符。\n”);
}    
} 
返回0;
}

这是因为您试图扫描一个数字。除了数字之外的任何东西都会导致未定义的行为,这正是您所经历的

为了避免这种情况,请通过检查scanf的返回值来检查您是否扫描了某些内容:

retval = scanf ("%f %c", &number, &operator);
如果
retval==0
,则给出的字符串不正确,可能会导致未定义的行为。有了这些知识,可以使用另一个while循环来扫描,直到您有了一个有效的输入

修复有点困难,因为scanf不会刷新输入缓冲区,因此会开始循环本身。为了解决这个问题,您需要某种缓冲区刷新机制。下面提供的示例只是通过getchar读取缓冲区,直到eol或eof,为将来的输入清除缓冲区

#include <stdio.h>

int main (void)
{
    float number;
    char operator;
    _Bool terminate = 0;
    float accumulator = 0;
    int c;

    printf ("Begin Calculations\n");

    while (terminate == 0) {
        while (scanf("%f %c", &number, &operator) != 2) {
            printf("Incorrect input\n");
            while((c = getchar()) != '\n' && c != EOF);
        }

        printf ("number %.6f      operator %c\n", number, operator);

        if (operator == '+') {
            accumulator += number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '-') {
            accumulator -= number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '*') {
            accumulator *= number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '/') {
            if (number == 0) {
                printf ("You can't divide by zero.\n");
            }
            else {
                accumulator /= number;
                printf ("= %.6f\n", accumulator);
            }
        }
        else if (operator == 'S') {
            accumulator = number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == 'E') {
            printf ("= %.6f\nEnd of Calculations.\n", accumulator);
            terminate = 1;
        }
        else {
            printf ("Unknown operator.\n");
        }
    }
return 0;
}
#包括
内部主(空)
{
浮点数;
字符算子;
_布尔终止=0;
浮动累加器=0;
INTC;
printf(“开始计算”);
while(终止==0){
while(scanf(“%f%c”、&编号和运算符)!=2){
printf(“不正确的输入\n”);
而((c=getchar())!='\n'&&c!=EOF);
}
printf(“编号%.6f运算符%c\n”,编号,运算符);
if(运算符=='+'){
累加器+=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='-'){
累加器-=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='*'){
累加器*=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='/')){
如果(数字==0){
printf(“不能被零除。\n”);
}
否则{
累加器/=数字;
printf(“=%.6f\n”,累加器);
}
}
else if(运算符='S'){
累加器=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符='E'){
printf(“=%.6f\n计算次数。\n”,累加器);
终止=1;
}
否则{
printf(“未知运算符。\n”);
}
}
返回0;
}

这是因为您试图扫描一个数字。除了数字之外的任何东西都会导致未定义的行为,这正是您所经历的

为了避免这种情况,请通过检查scanf的返回值来检查您是否扫描了某些内容:

retval = scanf ("%f %c", &number, &operator);
如果
retval==0
,则给出的字符串不正确,可能会导致未定义的行为。有了这些知识,可以使用另一个while循环来扫描,直到您有了一个有效的输入

修复有点困难,因为scanf不会刷新输入缓冲区,因此会开始循环本身。为了解决这个问题,您需要某种缓冲区刷新机制。下面提供的示例只是通过getchar读取缓冲区,直到eol或eof,为将来的输入清除缓冲区

#include <stdio.h>

int main (void)
{
    float number;
    char operator;
    _Bool terminate = 0;
    float accumulator = 0;
    int c;

    printf ("Begin Calculations\n");

    while (terminate == 0) {
        while (scanf("%f %c", &number, &operator) != 2) {
            printf("Incorrect input\n");
            while((c = getchar()) != '\n' && c != EOF);
        }

        printf ("number %.6f      operator %c\n", number, operator);

        if (operator == '+') {
            accumulator += number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '-') {
            accumulator -= number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '*') {
            accumulator *= number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == '/') {
            if (number == 0) {
                printf ("You can't divide by zero.\n");
            }
            else {
                accumulator /= number;
                printf ("= %.6f\n", accumulator);
            }
        }
        else if (operator == 'S') {
            accumulator = number;
            printf ("= %.6f\n", accumulator);
        }
        else if (operator == 'E') {
            printf ("= %.6f\nEnd of Calculations.\n", accumulator);
            terminate = 1;
        }
        else {
            printf ("Unknown operator.\n");
        }
    }
return 0;
}
#包括
内部主(空)
{
浮点数;
字符算子;
_布尔终止=0;
浮动累加器=0;
INTC;
printf(“开始计算”);
while(终止==0){
while(scanf(“%f%c”、&编号和运算符)!=2){
printf(“不正确的输入\n”);
而((c=getchar())!='\n'&&c!=EOF);
}
printf(“编号%.6f运算符%c\n”,编号,运算符);
if(运算符=='+'){
累加器+=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='-'){
累加器-=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='*'){
累加器*=数字;
printf(“=%.6f\n”,累加器);
}
else if(运算符=='/')){
如果(数字==0){
printf(“不能被零除。\n”);
}