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博客)