一个换算小程序引发的测试血案

请原谅我的标题写的有些夸张,但实际情况往往比想象的更离奇。好了进入主题。小A最近正在学习C语言,这时候小A上小学的儿子小B跑过来问:“爸爸,这道数学题怎么算?”,小A看了看题目说“一百天是多少个礼拜零多少天?”
好了,我们的小A,看到题目后不假思索,一迅雷不及掩耳盗铃之势写下了如下代码:

#include <stdio.h>

int main(void)
{
    int days;
    int week,day;
    printf("please in put a number:");
    scanf ("%d",&days)
    printf("%d are %d week(s) %d day(s)\n",days, days/7,days%7);

    return 0;
}

这是小A自己测试的结果:
测试结果

小A高兴地说:“来儿子,看爸爸给你算。“
这时候,小B小心翼翼的敲下:一百天, 然后把计算结果填在了作业本上。不料第二天小B哭着鼻子说:”爸爸,你骗我,答案是错的,全班就我一个人的答案是错的。~~(>_<)~~ “,小A说怎么可能,拿过来给我看看,小B把作业本给爸爸看。
一百天
小A说,这个只能输入数字,小B说:”爸爸,一百天就是100天 啊,“
小A想了想,最后改了程序如下:

#include <stdio.h>

int main(void)
{
    int days;
    int week,day;
    printf("please in put a number:");
    while (1)
    {
        int ret;
        ret=scanf ("%d",&days);
        if(ret == 1)
        {
            break;
        }
        printf("输入有误,请重新输入:");
        while (getchar() != '\n');
    }
        printf("%d are %d week(s) %d day(s)\n",days, days/7,days%7);

    return 0;
}

然后小A自己又测试了一下:
100天测试

然后小B说让他再试试,这次小A紧紧的看着小B。意想不到的事还是发生了。(呵呵,小B真调皮)
100tian

小A看到这种情况仔细想了想100tian很明显不符合输入,即使结果是正确的也不行,我是处女座,再改:

#include <stdio.h>

int main(void)
{
    int days;
    int week,day;
    printf("please in put a number:");
    while (1)
    {
        int ret;
        ret=scanf ("%d",&days);
        if(ret == 1 && getchar() == '\n')
        {
            break;
        }
        printf("输入有误,请重新输入:");
        while (getchar() != '\n');
    }
        printf("%d are %d week(s) %d day(s)\n",days, days/7,days%7);

    return 0;
}

测试结果:
这里写图片描述

小A这次觉得可以了,然而万万没想到,淘气的小B还是那么淘气:
这里写图片描述

哎,我们可怜的小A被儿子小B这么疯了。小A擡起沉重的手指再改。

#include <stdio.h>

int main(void)
{
    int days;
    int week,day;
    printf("please in put a number:");
    while (1)
    {
        int ret;
        ret=scanf ("%d",&days);
        if(ret == 1 && getchar() == '\n' && days >= 0)
        {
            break;
        }
        printf("输入有误,请重新输入:");
        while (getchar() != '\n');
    }
        printf("%d are %d week(s) %d day(s)\n",days, days/7,days%7);

    return 0;
}

完了小A再测试:
这里写图片描述
明明输100,为什么不运行了? 然后小A又敲了一次100
这里写图片描述
这次为什么又执行了,于是小A仔细看了看程序,终于找到了,原来是这句引起来的。
if(ret == 1 && getchar() == '\n' && days >= 0)
{
break;
}
printf("输入有误,请重新输入:");
while (getchar() != '\n');

因为键盘输入一个负数,前面两个条件都满足,只有第三个不满足,在程序中,程序把内存中的-100 放到 days中去了,然后释放内存,也就是说内存里现在什么都没有了,所以while (getchar() != ‘\n’);这句话就一直等待用户输入。然后被读走,导致程序没有反应。知道原因后小A这样改了程序:

#include <stdio.h>

int main(void)
{
    int days;
    int week,day;
    printf("please in put a number:");
    while (1)
    {
        int ret1,ret2;
        ret1=scanf ("%d",&days);
        if(ret1 == 1 && (ret2 = getchar()) == '\n' && days >= 0)
        {
            break;
        }
        printf("输入有误,请重新输入:");
        if (ret1 != 1 || ret2 != '\n')
        {
            while (getchar() != '\n');
        }
    }
        printf("%d are %d week(s) %d day(s)\n",days, days/7,days%7);

    return 0;
}

这里写图片描述

小A看到这里心里暂时是满意了。
谁知道后面还有一只更大的虫子,愿小A学习之路多钻研。
这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章