【问题标题】:C program goes into infinite loop with scanf [duplicate]C程序使用scanf进入无限循环[重复]
【发布时间】:2017-09-11 16:03:03
【问题描述】:

这是一个“工作”的程序,但如果输入字符数据“a”或“-8”,将进入无限循环。

这是当数据输入程序时的预期输出:

****Input (sales)   EXPECTED OUTPUT****
input: 5000.00      output: 650.00 
input: 1234.56      output: 311.11 
input: 1088.89      output: 298.00 
input: 0            output: 200.00 
input: 'a'          output: Warning and prompt to re-enter
input: -8           output: Warning and prompt to re-enter
input: -1           output: End Program

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h>

int main() {
  float sales, commission, earnings;

  while(true) {
    printf( "Enter sales in dollars ( -1 to end ): " );
    scanf( "%f", &sales );

    if ( sales == -1 ) {
      return 0;
    }

    commission = sales / 100 * 9;
    earnings = commission + 200;

    printf( "Salary is %.2f\n", earnings );
  }

  return 0;
}

谢谢。完全新手,感谢您的帮助。

【问题讨论】:

  • scanf() 返回它正确解析的“项目”数量,因此请检查它是否在此示例中返回 1。

标签: c scanf


【解决方案1】:

检查scanf的返回值,如果非法输入,清除输入缓冲区。

像这样:

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    float sales, commission, earnings;
    int state;

    while(true) {
        printf( "Enter sales in dollars ( -1 to end ): " );
        if((state = scanf("%f", &sales )) != 1){
            if(state == EOF)
                return 0;
            printf("invalid input.\n");
            while(getchar() != '\n');//clear input

            continue;
        }

        if ( sales == -1 ) {
            return 0;
        } else if(sales < 0){
            printf("invalid input.\nA negative value was entered.\n");
            continue;
        }

        commission = sales / 100 * 9;
        earnings = commission + 200;

        printf( "Salary is %.2f\n", earnings );
    }

    return 0;
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多