C语言进阶04-预防、检测及消除bug

C语言进阶04-预防、检测及消除bug,第1张

01

开发软件不等于编码

程序时会有"编码-->测试-->调试"的习惯.很不幸,这是开发软件的错误方法.专业的程序员会使用策略来预防、检测及消除软件bug.编码不是在开发软件.编码的意思是在文本编辑器中输入语句.编码只是开发软件的小部分.开发软件需要编程前、编程中、编程后的许多步骤.下面分着讲解.

02

编程前

1、了解需求.

2、考虑可能的输入和期望的输出.

3、识别出有效但非期望的输入和正确的输出.这是对于开发可靠的软件而言是一个关键点.

4、识别出无效输入并找到检测它们的方法.要注意即使输入无效的数据时,程序也不能奔溃.

5、想出解决办法,并记录.

6、设计程序,可以节省大量的时间.

03

编程中

1、若想正确且更快的完成程序, 就写更多的代码.为了满足一个要求而把代码放到一个更大的程序之前,写一个小程序来测试你的解决方案.即单元测试.

2、使用自动缩进的文本编辑器可以帮你检查代码是否对齐,可以节省宝贵的时间.

3、在运行之前一行一行的读代码.可以帮你找到通过测试很难发现的问题.

4、自己想一些测试例子. 若自己不知道自己写的代码,则计算机也不知道.

5、尽量使用函数来重构代码,避免复制代码.

6、要用版本控制系统(这不是废话吗).

7、编译时,警告信息也不要放过.

04

编程后

不要依赖测试,测试只会告诉你程序没有正常工作,不会告诉你程序真的在正常运行.很可能测试用例没有涵盖所有可能的方案.通过测试用例涵盖所有可能的方案是很困难的.

05

常见错误

未初始化变量: 一些人认为所有的变量都会自动初始化为0,C语言中不会初始化.通过测试很难测试出来.

错误数据类型: 需要理解并正确地使用类型,编程语言的趋势是让数据类型更有限制性,防止犯意外的错误.

06

后执行式和交互式调试

调试一个程序分为几个阶段, 举个列子:

1、从一个文件中读取一些整数

2、把整数排序

3、把排好序的整数存到另一个文件中

单元测试: 在上面三部整合之前测试每一部分叫作单元测试.

对于单元测试,经常需要写一些额外的代码,作为单独部分的"驱动".调试可能是交互式或后执行式的.若程序会花费几个小时,你就不会想要用交互式来调试这个程序了.相反,你会想要程序打印出调试信息,即日志.

对交互式调试而言打印调试信息存在多个问题:

1、需要插入代码来打印调试信息.多数情况下,调试信息必须在随后被移除,因为此信息不应该出现在最终的代码和它的输出中.

2、如果有很少的信息,那么就会缺少足够的信息帮助你判断哪里错了.

3、如果信息太多,可以忽略不相关的信息,获得好信息是很困难的.

4、最糟糕的是,问题可能会出现在意想不到的地方,而那里却并未插入调试信息.结果就是添加越来越多的调试信息.这是很耗时的.

07

生产代码与测试代码分离

自己应该能检测出自身bug的程序.编写程序之前就应该考虑编写测试代码.这是普遍的做法,这个称为 测试驱动的开发. 开发的时候需要将测试代码和开发代码分开,这样可以随意删除测试代码.

循环一次里面,sum计算了两次,分母变成 1 3 3 5 5 7……与公式不一致,eps表示精度是一个浮点数,不能直接使用<>=来判断大小。

C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。

扩展资料:

C语言包含的各种控制语句仅有9种,关键字也只有32 个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。

实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。

C语言是一种结构化的语言,提供的控制语句具有结构化特征,如for语句、if⋯else语句和switch语句等。可以用于实现函数的逻辑控制,方便面向过程的程序设计。

#include<stdio.h>

void main()

{

char filename[30]

FILE *fpt

printf("Please create a name for the file.\n")

scanf_s("%s", filename,30)//scanf_s在输入字符串的时候,要指定大小。

fopen_s(&fpt,filename, "w")

if (fpt == NULL)

{

printf("No file is created.")

}

else

{

int c

while ((c = getchar()) != EOF)//这里应该是EOF 

{

_fputchar(c)

}

fprintf(fpt, "CTRL + A is a correct ending.\n")

fclose(fpt)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8109326.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存