如何使用相同的响应阻止我的C程序充斥控制台

时间:2017-10-04 16:57:49

标签: c

这个问题的标题很难说,但我希望你能原谅我,我将在这里详细说明。 我遇到的问题是我的C程序充斥着控制台"输入学生的成绩:F"如果我输入除整数之外的任何东西。我是C的新手,所以我不明白如何检查输入是否属于有效类型。

int main() {
  int grade; //number 0-10 associated with the letter grade
  while (1) {
    printf("Enter the student's grade: ");
    scanf("%i", &grade);
    switch (grade) {
      case 10: printf("A \n"); break;
      case 9: printf("A \n"); break;
      case 8: printf("B \n"); break;
      case 7: printf("C \n"); break;
      case 6: printf("D \n"); break;
      case 5: printf("F \n"); break;
      case 4: printf("F \n"); break;
      case 3: printf("F \n"); break;
      case 2: printf("F \n"); break;
      case 1: printf("F \n"); break;
      case 0: printf("F \n"); break;
      default: printf("Please enter a valid test score \n"); break;
    }
  }
  return 0;
}

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

检查FetchFile是否成功。

scanf

查找任何书籍,您都会知道int nread = scanf("%i", &grade); if (nread != 1) // scanf failed, start cleanup { scanf("%*[^\n]%*c"); } 会返回已成功阅读的元素数量,因此如果您输入一个字母,它将无法读取整数并返回scanf(没有读过),那么你就可以知道有什么不对劲并丢弃错误的东西。

由于0在遇到错误时没有读取任何内容,错误的内容将保留在输入缓冲区中,严重的是它会破坏下一个scanf,导致无限输出刷新

P.S。您不需要在scanf之后重复语句,只需将它们合并为一个:

case 5 4 3...

答案 1 :(得分:0)

检查scanf的返回。 1表示已成功扫描整数。 0表示输入不是整数。清理输入流并重试。

#include <stdio.h>

int main ( void) {
    int grade; //number 0-10 associated with the letter grade
    int valid = 0;
    while (1) {
        do {
            printf("Enter the student's grade: ");
            if ( 1 != ( valid = scanf("%i", &grade))) {// 1 is success
                if ( EOF == valid) {
                    printf ( "found EOF\n");
                    return 0;
                }
                while ( '\n' != getchar ( )) {//clear input stream
                }
            }
        } while ( !valid);
        switch (grade) {
            case 10: printf("A \n"); break;
            case 9: printf("A \n"); break;
            case 8: printf("B \n"); break;
            case 7: printf("C \n"); break;
            case 6: printf("D \n"); break;
            case 5: printf("F \n"); break;
            case 4: printf("F \n"); break;
            case 3: printf("F \n"); break;
            case 2: printf("F \n"); break;
            case 1: printf("F \n"); break;
            case 0: printf("F \n"); break;
            default: printf("Please enter a valid test score \n"); break;
        }
    }
    return 0;
}