一個換算小程序引發的測試血案

請原諒我的標題寫的有些誇張,但實際情況往往比想象的更離奇。好了進入主題。小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學習之路多鑽研。
這裏寫圖片描述

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