我的编程空间,编程开发者的网络收藏夹
学习永远不晚

实用调试技巧(2)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

实用调试技巧(2)

文章目录

6. 如何写出好(易于调试)的代码

6.1 优秀的代码:

  1. 代码运行正常
  2. bug很少
  3. 效率高
  4. 可读性高
  5. 可维护性高
  6. 注释清晰
  7. 文档齐全

常见的coding技巧:

  1. 使用assert
  2. 尽量使用const
  3. 养成良好的编码风格
  4. 添加必要的注释
  5. 避免编码的陷阱

6.2 示范:

模拟实现库函数:strcpy

我们先来看一下strcpy是如何使用的:

#include #include int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";//strcpy(arr2, arr1);//printf("%s\n", arr2);printf("%s\n", strcpy(arr2, arr1));return 0;}

接下来我们来实现它:

#include void my_strcpy(char* dest, char* class="lazy" data-src){while (*class="lazy" data-src != '\0'){*dest = *class="lazy" data-src;dest++;class="lazy" data-src++;}*dest = *class="lazy" data-src;// \0 的拷贝}int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;}

我们还可以使用assert对它进行优化:

#include #include void my_strcpy(char* dest, char* class="lazy" data-src){//断言assert(dest != NULL);assert(class="lazy" data-src != NULL);while (*class="lazy" data-src != '\0'){*dest = *class="lazy" data-src;dest++;class="lazy" data-src++;}*dest = *class="lazy" data-src;// \0 的拷贝}int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";char* p = NULL;//my_strcpy(p, arr1);my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;}

通过assert,我们可以确保某些事情不会发生,一旦发生,它就会报错,这样就能方便我们快速找到错误。

我们还可以将字符和\0的拷贝放到一起:

#include #include void my_strcpy(char* dest, char* class="lazy" data-src){//断言assert(dest != NULL);assert(class="lazy" data-src != NULL);while (*dest = *class="lazy" data-src)//赋值表达式,比如把h赋给*dest,表达式的结果就是h的ASCII码值{dest++;class="lazy" data-src++;}}int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";char* p = NULL;//my_strcpy(p, arr1);my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;}

还可以这样写:

#include #include void my_strcpy(char* dest, char* class="lazy" data-src){//断言assert(dest != NULL);assert(class="lazy" data-src != NULL);while (*dest++ = *class="lazy" data-src++)//赋值表达式,比如把h赋给*dest,表达式的结果就是h的ASCII码值{;//空语句}}int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";char* p = NULL;//my_strcpy(p, arr1);my_strcpy(arr2, arr1);printf("%s\n", arr2);return 0;}

此外,我们还可以对返回类型进行优化:

#include #include //函数返回的是目标空间的起始地址char* my_strcpy(char* dest, char* class="lazy" data-src){char* ret = dest;//断言assert(dest != NULL);assert(class="lazy" data-src != NULL);while (*dest++ = *class="lazy" data-src++)// 赋值表达式,比如把h赋给*dest,表达式的结果就是h的ASCII码值{;//空语句}return ret;}int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";char* p = NULL;//my_strcpy(p, arr1);//my_strcpy(arr2, arr1);//printf("%s\n", arr2);printf("%s\n", my_strcpy(arr2, arr1));return 0;}

另外,为了保证传进去的arr1不被修改,我们还可以加上const进行修饰:

#include #include //函数返回的是目标空间的起始地址char* my_strcpy(char* dest, const char* class="lazy" data-src){char* ret = dest;//断言assert(dest != NULL);assert(class="lazy" data-src != NULL);while (*dest++ = *class="lazy" data-src++)// 赋值表达式,比如把h赋给*dest,表达式的结果就是h的ASCII码值{;//空语句}return ret;}int main(){char arr1[] = "hello bit";char arr2[20] = "xxxxxxxxxxxxx";char* p = NULL;//my_strcpy(p, arr1);//my_strcpy(arr2, arr1);//printf("%s\n", arr2);printf("%s\n", my_strcpy(arr2, arr1));return 0;}

6.3 const的作用

有以下两种方式可以修改num的值:

int main(){int num = 10;num = 20;int* p = #*p = 200;return 0;}

现在我们加上const:

#include int main(){const int n = 100;//n = 200;//errint* p = &n;*p = 20;printf("%d\n", n);return 0;}

加上const是为了不让n的值发生变化,但是现在我们却可以通过地址的方式来改变它,于是我们可以进行以下操作:

int main(){const int n = 100;//n = 200;//err//int* p = &n;//*p = 20;//printf("%d\n", n);const int* p = &n;//*p = 20;//errreturn 0;}

通过以上代码我们可以发现const是可以修饰指针的:

//const 修饰指针的时候//当const 放在*的左边的时候,限制的是指针指向的内容,不能通过指针变量改变指针指向的内容,但是指针变量本身是可以改变的//当const 放在*的右边的时候,限制的是指针变量本身,指针变量本身是不能改变的,但是指针指向的内容是可以通过指针来改变的#include int main(){int m = 10;int n = 100;//const可以修饰指针const int* p = &m;//*p = 0;//errp = &n;//okprintf("%d\n", m);return 0;}
#include int main(){int m = 10;int n = 100;//const可以修饰指针int* const p = &m;*p = 0;//ok//p = &n;//errprintf("%d\n", m);return 0;}
#include int main(){int m = 10;int n = 100;//const可以修饰指针const int* const p = &m;//*p = 0;//err//p = &n;//errprintf("%d\n", m);return 0;}

练习:

模拟实现一个strlen函数

//模拟实现一个strlen函数//assert//const//size_t 是专门为sizeof设计的一个类型//size_t --> unsigned int / unsigned long//>=0#include #include size_t my_strlen(const char* str){assert(str != NULL);size_t count = 0;while (*str != '\0'){count++;str++;}return count;}int main(){char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);//zd是专门用来打印size_t类型的值的return 0;}//%u 无符号整数的

7. 编程常见的错误

7.1 编译型错误

直接看错误提示信息(双击),解决问题,或者凭借经验就可以搞定,相对来说简单。

int main(){int a = 10//编译期间找到的一般都是语法问题return 0;}

7.2 链接型错误

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在,一般是标识符名不
存在
或者拼写错误

//链接型错误是在链接期间发现的错误int Add(int x, int y){return x + y;}int main(){int ret = add(2, 3);return 0;}

7.3 运行时错误

借助调试,逐步定位问题,最难搞。

#include int Add(int x, int y){return x - y;}int main(){int ret = Add(2, 3);printf("%d\n", ret);return 0;}

附:

实用调试技巧(1)

来源地址:https://blog.csdn.net/weixin_73077334/article/details/132676042

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

实用调试技巧(2)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++ 函数调试的实用技巧

C++ 函数调试的实用技巧引言调试 C++ 函数可能是具有挑战性的,尤其是对于大型和复杂的函数。本文介绍了一些实用的技巧,可以帮助您高效地调试 C++ 函数,并识别和解决错误。实战案例考虑下面这个 C++ 函数,它计算两个数字的平均值:
C++ 函数调试的实用技巧
2024-04-18

超实用的Chrome DevTools调试技巧!

Chrome DevTools 提供了很多实用功能来调试源代码、捕获元素状态、更新和测试元素属性、模拟各种设备环境等。今天就来学习几个超实用的调试技巧!

简单实用的Android studio 调试技巧

说到android studio的调试,很多人可能会说,这有什么可讲的不就是一个断点调试么,刚开始我也是这么认为的,直到我了解之后,才发现,调试原来可以玩的这么牛。下面我分别一一做介绍。条件断点(Conditional Breakpoint
2022-06-06

如何高效调试 Java Grok 模式?分享实用技巧!(Java Grok模式的调试技巧)

在Java开发中,Grok模式是一种非常强大的日志分析工具,它可以帮助开发人员快速解析和处理日志数据。然而,在使用Grok模式进行日志分析时,调试可能会成为一个挑战。本文将分享一些实用的JavaGrok模式调试技巧,帮助你更高效地调试Grok模式。一、了解
如何高效调试 Java Grok 模式?分享实用技巧!(Java Grok模式的调试技巧)
Java2024-12-15

Django的调试技巧

本篇内容主要讲解“Django的调试技巧”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Django的调试技巧”吧!Django框架的单步调试在pycharm中,点击Run->选择Debug运行-
2023-06-02

Python代码调试技巧

原文地址:http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/一、使用pdb进行调试pdb是Python自带的包,为Python提供一种交互的源代码调试功能。常用命令
2023-01-31

JavaScript 断点调试技巧

这篇文章将介绍如何使用断点来进行 JavaScript 调试。在读这篇文章之前,需要问一个问题:为什么要使用断点来进行调试?

如何进行 java exchanger 的调试和监控?有哪些实用技巧?(java exchanger的调试和监控技巧)

在Java开发中,调试和监控是确保代码质量和系统稳定性的重要环节。对于Javaexchanger来说,更是如此。本文将介绍一些关于Javaexchanger的调试和监控技巧,帮助开发者更好地理解和处理系统中的问题。一、调试技巧
如何进行 java exchanger 的调试和监控?有哪些实用技巧?(java exchanger的调试和监控技巧)
Java2024-12-21

Python3 调试技巧 —— 死循环

说下Python3不使用gdb的自身调试前情提要:服务器莫名卡死,用网上的方法用gdb,下载了很多组件,包括那个libpython.py,都没什么用,看不到堆栈,也试了保存core文件等等大事找官方:官方介绍了python3的调试方法——p
2023-01-30

python调试技巧有哪些

这篇文章将为大家详细讲解有关python调试技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。调试技巧1. 脚本调试Python的脚本调试可以是使用pdb模块。它可以让我们在脚本中随意设置设置断点:
2023-06-27

JSP调试技巧有哪些

这篇文章主要介绍“JSP调试技巧有哪些”,在日常操作中,相信很多人在JSP调试技巧有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JSP调试技巧有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!使用
2023-06-28

PHP 函数调试技巧和最佳实践

php 函数调试技巧:查看堆栈跟踪以确定异常位置。使用 debug_backtrace() 取得函数调用详细信息。设置断点以在特定点暂停执行。使用 var_dump() 和 print_r() 输出变量值。创建日志文件记录函数行为和错误。最
PHP 函数调试技巧和最佳实践
2024-05-01

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录