引言:
Debug也是算法时一种能力的体现,在算法练习的过程中,不光要学习各种算法知识(c++,stl,数据结构等),还需要学会调试自己的代码。每一个人在所遇到的bug是不相同的,只是希望能给初学者在debug的时候,提供一些经验,我所写下的内容不多,仅作为参考,希望能给其他人带来一些帮助。
- 前提:
- 比赛意见:
- 个人感悟:
- 一.初识bug:(基础bug)
- 二.反馈:
- 三.检测时的几种错误:
- 四.输入格式与预期不符合:
- 五.输入结果为空:
- 六.书写代码的一些小建议:
- 七.删改代码:
- 八.多组数据:
- 九.字符串问题:
- 十.注意使用函数之后,变量转换的类型:
- 十一.思维题:
前提:
要确保自己的心态是平静的。
每一次的提交,都应该谨慎思考。
在调试的过程中,应该放弃对代码的自信(简单说应该以旁观者的角度去看自己的代码,当你对这个代码的信任度为0,越能发现问题所在)
同时,调试者应该拓展的能力有灵活使用IDE,并且明白IDE返回的错误信息;
将程序分为模块,使用倒推的方式进行测试(或者在开始前就一步一步的进行测试);
在if 和for 这种内含条件的函数中,往往是最容易出现错误的;
最重要的一点是,$\textcolor{Red}{需要对题目所阐述的问题有着清楚的了解}$,这样,在debug过程中思路会越来越清晰(在团队赛的时候,在自己读完题目之后,要和队友进行沟通,了解对方的思路,判断目标实现的可能性)
比赛意见:
1.请不要把变量名称定义的太抽象!!!(到最后,不光你看不懂,队友也看不懂)
2.如若出现,电脑死机,或者主动关机的情况下,千万不要随意乱动,请及时联系工作人员。
3.如果在正式开始的时候,发现无法进入比赛要求的系统,需要及时联系工作人员。
4.发放账户密码的纸张,请自己盖好,防止其他队伍登录,帮你增加罚时!!!
5.注意观察榜单,挑简单的先做。
6.注意!!!不要在比赛时间尚未开始时翻看试卷。
7.不要有心理压力,放平心态。
8.不要犯罪!!!(在提交显示错误之后,请认真修改)
9.如果遇到提交结果为undefined,请暂停提交(测题机坏了),如果继续提交,很有可能一堆wa下去。

10.千万不要按Ctrl+Alt+F10,会使电脑死机
11.注意好保存自己的代码,防止出意外。
个人感悟:
放平心态,这也是我在经历数次的折磨之后,明白的一件事情,专心调试就好,有什么可在意的呢?(虽然有位学长总是在强调“犯罪”的问题,但这只是为了让你重视和珍惜每一次提交的机会,同时不要太过有压力,就算一题都做不对又怎么样呢?)做你自己,尽力就好,享受过程,debug是痛苦的,但是在这一次次漫长而又枯燥的过程中,我们理应学会苦中作乐。
一.初识bug:(基础bug)
在刚开始学习的过程中,所遇见的bug,我在此称之为基础bug,基础bug指的是IDE所能识别出的bug。
所以,面对基础bug的最好解决方式就是———-打开$\textcolor{Red}{IDE}$
常见的基础bug:
1 | 例如:C语言中scanf("%d",&a); //常见的错误就是忘记输入了&(取地址符) |
{}问题,很多时候,由于自己的复制剪贴,可能会使得}漏掉,这个时候点击测验的时候,可能会有error’}’这种提示,可以叫做反馈,因而要注意在写代码的过程中,是否忘记 ‘}’ 符号。
1 | 例如:int a; |
这里需要注意的是,不要将同一个变量重复定义,如果因为代码所需要的变量过多,可以用以下方式进行优化。
1 | for(int a=0;a<5;a++){ |
由于变量a是在for循环内部定义的,因此可以重复定义。(有一定风险就是,你得确保这个变量不需要保存数据什么的,因为在外界使用的话,不会显示该变量)
!!!.函数传数组:

正确传递数组的方式为:


二.反馈:
在debug的过程中,反馈尤为重要,常见的做法是,在每一个模块的内部,放置一条语句
1 | 例如:printf("123"); |
看看该语句是否在判断语句的内部中实现。(自行找到反馈,计算机不能告诉到底是哪个环节输入错误,但是你可以自己验证并得到反馈)
大部分IDE和做题系统,上面的反馈都是英文的,不要求把单词都认的出来,但是一定要学会找到关键信息(真正的错误提示);
三.检测时的几种错误:
检测时,要注意输入的是案例几,别对着案例一进行检测,然后对着案例二的答案进行修改!!!
1.编译错误:

这也是这里面最容易修改的错误,一般根据反馈,找出关键信息,即刻修改。
例如此案例,能清楚的看见计算机将错误的语句反馈给我们,
当然,如果看不懂计算机告诉你的信息,建议一点点的开始看,从找关键符号,和使用翻译软件等方式解决。
2.运行超时:

基本上就是for等循环出现了问题,一般要关注的点有,循环条件,循环变量是否在函数内部进行改变,以至于陷入死循环。
for循环内部无范围限制
1 | 例如:for(int i=1;i<5;) //缺少了i++(变量未改变) |
$\textcolor{Red}{ ps : while循环比较特殊,它可以存入特殊循环条件}$
又或者是for循环中出现
1 | for(int i=0;i<n;j++) //循环变量名称错误!!! |
若是使用while循环
1 | 请检查: |
3.无法在规定时间内运行:
只有一种原因,那就是时间复杂度过高,导致超时,解决方法很简单,通过if等其他手段,减少for循环的使用。
从某种层面来讲,时间复杂度过高的问题是众多bug里面最明确的bug,解决的方式可以选择更换做题思路,可能是自己将简单问题复杂化了,算法题的思路有很多种,如果可以,请不要将自己的思维固化。
有些题是无法单纯通过暴力枚举解决的,暴力枚举的无脑,换来的代价就是极高的时间复杂度。
可以去学习一些优化操作,如剪枝等;
在算法的学习中,需要去学会计算时间复杂度
4.段错误:

段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起。
一般情况,需要检查的是数组是否开的过多,导致数组越界(数组越界,是因为连续开两个数组,在内存中的排布其实是相连的)
解决方式:如果自己定义的数组过多,可以考虑删除一个数组。
检查自己的数组容量是否开的过大(一般范围是在1e8左右)
下标是否正确?一般是在循环中查看是否循环内容出了问题
$\textcolor{Red}{递归}$一般不会出现这种情况,并不优先考虑
ps:检查到底是哪个环节出现问题,通过将部分语句变成注释//,看看是否仍然发生段错误,如果到了最开始时,仍出现段错误,那么只有一种结果就是数组开的过于庞大。
!!!在一些题中,不要根据题目中出现数组,就一味的去使用数组,当出现数组越界的时候,最好是转换思路,同时减少或者避免数组的使用
!!!在做题中,请减少定义二维数组
5.输入格式不符:
这就是自己本身审题不够严谨的原因了,去检查最后输出格式是否遗漏” “(空格)
还有保留几位小数点
如果是四舍五入的问题,注意使用round函数(四舍五入到整数)。使用方式:通过*保留位数的10次幂,再将其除掉。
6.正确率为**%:

个人认为,这种情况难改程度和无法在规定时间内运行
如果正确率在50%附近徘徊,说明此题可能分奇数和偶数,随后将输入示例,看看是否和奇数和偶数有关系。
如果正确率较低,那么基本上,切换示例就能够看出来问题出现在哪。(可能是数据范围小了)
四.输入格式与预期不符合:

如此题所示,在使用C++输入时候,如果将一串数据分单个数字存入其中,cin无法实现,请选择使用C语言中的scanf(“%1d”,a);
%1d意味着,每次只存入一个数。
所以在做题的过程中,需要注意示例的输入格式。
ps:虽然C++在输入输出等层面变得更加便利和迅速,但是C语言的某些功能,仍然是必不可少的,因此,在拓展C++语言的时候,也不要忘记巩固C语言的使用。
!!!同时,观察运行时间是否超时,这种时候一般为超时,以至于有些案例无法正常通过,需要改变解题思路。
五.输入结果为空:
对于debug过程中,最怕的就是没有收获任何的反馈,因此在面临输入结果为空的时候,优先去查看自己的输出语句。
1 | 例如:for( ; ; ){ |
除此之外,还有各种判断语句,都可能影响最后输出为空的情况。
如果是for循环和if的嵌套情况之下,可以通过
1 | cout<<"语句"<<endl; |
判断是哪个环节出现错误。
同时,在定义变量的情况之下,有的时候需要将变量进行初始化=0

例如这道题:去除前导0,不只是出现0408这种情况,还有可能会出现00408,因此在debug的过程中,通过判断数组的第一位是否为0是远远不够的,而如果只判断数组是否为0,然后为0不输出0,也是不可取的,因为这样的话,只会留下48。(只判断是否为0,并不是删除前导0,是删除数组中所有的0)
1 | for(int p=0;p<c;p++){ |
错误代码如下:
1 | for(int p=0;p<c;p++){ |
错误原因:意外使用break;同时break是在for循环中放置,并非是放置在if中,因此造成了输出结果为空。
六.书写代码的一些小建议:
1.定义变量:
在定义整型变量的时候,尽量使用long long 而非int,这样可以不用判断数据是否超过Int型。
同理,在定义浮点型的时候,选择使用double,精确度更高,确保小数点的后几位都是正确的。
如果觉得long long在输入过于繁琐,可以选择在开头
1 |
|
同时,定义变量名称的时候,尽量避免使用o作为变量名称(因为o可能会和零混用
)
2.观感:
尽量让自己代码的长度缩减一点
使用三项表达式:
1 | 表达式1?表达式2:表达式3 |
格式改变:
1 | 例如: |
可以看出,优化后的代码减少了一行,这样看可能不太直观,那如果很多个for循环叠加的话?
1 | for(int i=0;i<n;i++){ |
仅仅只是两个for循环的嵌套,就能看的出来,将 ‘ { ‘ 推进一行,所带来的观感就变得大不相同。
当然,可以稍微紧凑一点,因为过长的代码容易分辨不清各个语句的分布,但是请不要将代码堆砌成密不透风的城墙,这样也会影响读代码时候的速度。
3.输入:
输入数组时,要注意变量名称和变量位置是否正确:
例如: y[i]-x[i],不要写成y[i]-y[i]
七.删改代码:
删改代码的时候,不要进行遗漏,或者误删,在进行删除时,之后要**$\textcolor{Red}{重新进行检查}$**。
必要的时候通过使用注释来表明点。
八.多组数据:
在有些题目的样例中,并没有举出多组输入,这往往会被人所忽略,在做题前请认真读题。
1 | int t;//几组数据 |
1.如果要识别换行符:输入
1 | cin.get()='\n' |
2.循环输入到结束:
1 | whlie(cin>>n) |
九.字符串问题:

在输入数字字符串的时候;
虽然输入的是数字,但是存入的确实字符,因此,如果要将数字输出,需要减去字符‘0’
1 | 例如:b[i]-'0'; |
在字符串题中,我一般使用C++中的string来写
string函数定义:string a;
输入(包括空格的输入)getline(cin,a);
知晓字符串的尺寸 :a.size()
开循环单个输出字符串:
for(int i=0;i<a.size();i++)
{
cout<<a[i];
}
字符串长度length()
*******非必要,别开那么多的数组,无论是字符串数组,还是正常数组
*******数组越界,纯自找的,少给自己整点麻烦事!!!!!!!
c++中的size()和length()没有区别
都能算出字符长度
string str:生成空字符串
string s(str):生成字符串为str的复制品
string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值
string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值
string s(num ,c):生成num个c字符的字符串
string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值
eg:
1 | string str1; //生成空字符串 |
- size()和length():返回string对象的字符个数,他们执行效果相同。
- max_size():返回string对象最多包含的字符数,超出会抛出length_error异常
- capacity():重新分配内存之前,string对象能包含的最大字符数
****string的交换:
****void swap(string &s2); //交换当前字符串与s2的值
string的插入:push_back() 和 insert()
void test4()
{
string s1;
1 | // 尾插一个字符 |
}
C++删除string最后一个字符的几种方法
#include
#include
using namespace std;
int main()
{
string str;
str = “123456”;
cout << str << endl;
1 | //方法一:使用substr() |
}
十.注意使用函数之后,变量转换的类型:
pow( )
sqrt( )
需要在函数前面进行强制性转换(long long)
同时pow( )中,无法使用1/3(不是整除的数)
十一.思维题:
在做一些题的时候,注重思维理解,找出简单算法,往往硬算会很困难。
- 本文作者: T Mumu
- 本文链接: http://example.com/2025/07/18/Debug-Secret-Script/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!