PAT平臺,“運行時錯誤”定位

1 PAT平臺,定位到“ 運行時錯誤”方法

  我們用桌面版的IDE開發的代碼,編譯通過,且在本地運行正常,提交代碼到PAT平臺時,有時會報“運行時錯誤”。怎樣定位到錯誤處呢?下面提供一個可行的方法,本方法參考文獻1。
  在開始之前,科普下#if 0 #endif,它相當於註釋的作用,如下所示。具體參考文獻2。

#if 0 
    // 夾在中間的代碼塊,是被註釋掉的代碼塊
#endif

  方法:
  1 用#if 0 #endif,從main函數末尾開始,註釋掉最末的代碼塊n。點擊提交。進行步驟2。
  2 查看提交結果,是否由“運行時錯誤”,轉變成"答案錯誤"或者"答案正確"。
  如果是,說明出現“運行時錯誤”的地方,在#if 0下面緊挨着的代碼塊處,進入步驟4。
  如果否,進行步驟3。
  3 將#if 0前移到當前#if 0所在代碼塊的前一個代碼塊位置,點擊提交,返回步驟2。(例:第一次進行步驟3時,將#if 0剪切到第n-1個代碼塊之前,第二次進行3時,將#if 0剪切到第n-2個代碼塊之前......)。
  4 定位到出錯代碼塊處後,可以更細粒度的在出錯代碼塊繼續定位行。使用#if 0 #endif註釋掉出錯誤代碼塊的最末一句。點擊提交,查看提交結果,是否由“運行時錯誤”,轉變成"答案錯誤"或者"答案正確"。
  如果是的話,找到了出錯代碼行,結束查找過程。
  如果否的話,把#if 0前移一行或若干行,點擊提交,觀察提交結果。逐行的,從後向前註釋代碼塊n中的代碼行,直到找到出錯的代碼所在行,結束查找過程。

#include <stdio.h>

int main(int argc, char **argv) {    
    // 代碼塊1
    {
        // ...       
    }
    
    // 代碼塊2
    {
        // ...       
    }
    
    ...
    // 所設它是出錯代碼塊i
    {
        // code line1;        
        // code line2;
        
        ...
        
        // code linej-1
// 把"#if 0"前移一行或若干行,點擊提交,觀察提交結果,直到定位到出錯的代碼行。
#if 0        
        // code linej;
#endif 
    }
    ...
    
    // 代碼塊n-1
    {
        // ...       
    }    

// 逐步的移動"#if 0"到前一個代碼塊,直到定位到出錯的代碼塊。
#if 0        
    // 代碼塊n
    {
        // ...       
    }    
#endif    
}

2PAT“ 運行時錯誤” 的一個例子。

  開發語言:C。
  出錯描述:需求是將字符串複製到字符數組,使用的是strcpy(字符數組1,字符串2)函數。結果出現了上述錯誤。
  解決方法:使用memcpy函數代替strcpy。參考文獻3。

3 參考文獻:

[1] https://mergebubble.github.io... (PAT 1016 | 黑小豬與豬小白)
[2] https://blog.csdn.net/weibo12... (C++中#if 0 ... #endif的用法 - 魏波 - CSDN博客)
[3] https://blog.csdn.net/u011391... (C語言中的複製函數(strcpy和memcpy) - Dufre - CSDN博客)

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