请教各位高手,如何给下列代码进行优化,使其具有应对非法字符输入的防御功能/输入错误的解决方案

题目描述

下面是小学生计算机辅助系统的程序代码
无逻辑错误但是存在一个缺陷,缺乏应对输入非法字符的防御机制

题目来源及自己的思路

相关代码

#define _CRT_SECURE_NO_WARNING
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
int States(int rem);
int GetRandom();    
int Calc(int magic1, char op, int magic2);
char GetOp();
/*Declare functions in the beginning在开头声明所调用的函数:
1.Functions States(rem) means creates a comment on user's answer,
  定义的States函数在每次调用时对用户输入的答案随机生成一个正确或者错误的提示(rem即为remark);
2.GetRandom() means creates a random number,
  定义的GetRandom函数在每次调用时生成一个随机数,通过定义函数的方式可以避免生成伪随机数;
3.Calc(magic1,op,magic2) means create a random arithmetic between magic1 and magic2;
  定义的Calc函数在每次调用时随机生成一个关于magic1和magic2的四则运算,运算类型由op决定;
4.Getop() means creates a random operator(varies among arithmetic operators);
  定义的CetOp函数在每次调用时随机生成一个四则运算符;(op即为operator,由于是字符型,应该用char来声明) */

int main()
{
    int magic1, magic2, ans, counter, rem, ret = 0,  sign=0;
    char op;
    srand(time(NULL));
    do
    {
        for (counter = 0; counter < 10; counter++)
        {
            magic1 = GetRandom();
            magic2 = GetRandom();
            op = GetOp();
            printf("Please answer the question:\n%d%c%d=?\n", magic1, op, magic2);
            printf("Your answer is:");
            scanf_s("%d", &ans);
            if (ans == Calc(magic1, op, magic2))
            {
                ret++;
                rem = rand() % 4 + 1;//生成一个1到4之间的随机数,对应一个正确的提示
                States(rem);
            }
            else
            {
                rem = rand() % 4 + 5;//生成一个5到8之间的随机数,对应一个错误的提示
                States(rem);
            }
        }
        printf("Total number of points is %d.\n", ret * 10);
        printf("The accuracy of your answers is %d%%.\n", ret * 10);
        if (ret * 10 < 75)
        {
            printf("Please test again!\n");//如果正确率低于75%,提示用户重新进行测试
            ret = 0;
            sign = 1;
        }
        else sign = 0;
    } while (sign);
    return 0;
}

int GetRandom()
{
    return rand() % 10 + 1;
}

char GetOp()
{
    int op;
    op = rand() % 4 + 1;
    switch (op)
    {
    case 1:return '+';
    case 2:return '-';
    case 3:return '*';
    case 4:return '/';
    }
    return 0;
}

int Calc(int magic1,char op,int magic2)
{
    switch (op)
    {
    case '+': return magic1 + magic2;
    case '-': return magic1 - magic2;
    case '*': return magic1 * magic2;
    case '/': return magic1 / magic2;
    }
    return 0;
}

int States(int rem)
{
    switch (rem)
    {
    case 1: printf("Very good!\n");
        break;
    case 2: printf("Excellent!!\n");
        break;
    case 3: printf("Nice work!\n");
        break;
    case 4: printf("Keep up the good work!!\n");
        break;
    case 5: printf("Wrong. Try once more.\n");
        break;
    case 6: printf("No.Please try again.\n");
        break;
    case 7: printf("Don't give up!\n");
        break;
    case 8: printf("Not correct.Keep trying!\n");
        break;
    }
    return printf("\n");
}

请教各位如何避免因为输入非法字符造成程序运行出错?
球球了

阅读 1.9k
1 个回答
// 如果输入非数字(开头),那么吃掉缓存区全部内容,重新等待
while(scanf_s("%d", &ans) == 0) {
    printf("illegal\n");
    while(getchar() != '\n');
}
// 如果是数字加其他内容,那么吃掉非数字内容(典型的就是吃掉 \n )
while(getchar() != '\n');
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题