C语言入门(20)——使用VC2013对C语言进行调试
来源:互联网 发布:如何提升淘宝宝贝权重 编辑:程序博客网 时间:2024/06/06 14:55
软件调试过程中,有时会一些逻辑和内存访问方面的问题,如果没有调试器的帮助,找出何处代码导致这块内存被更改是一件非常麻烦的事情。恰当运用数据断点可以快速帮我们定位问题的所在。
1、VC的调试快捷键
F5: 开始调试
Shift+F5: 停止调试
F10: 调试到下一句,这里是单步跟踪
F11: 调试到下一句,跟进函数内部
Shift+F11: 从当前函数中跳出
Ctrl+F10: 调试到光标所在位置
F9: 设置(取消)断点
Alt+F9: 高级断点设置
2、VC调试方法
譬如下面一段程序:
#include<stdio.h>#include <stdlib.h> int main(void){ intsum = 0, i = 0; charinput[5]; while(1) { scanf("%s", input); for(i = 0; input[i] != '\0'; i++) sum= sum * 10 + input[i] - '0'; printf("input=%d\n", sum); } system("pause"); return0;}
这个程序的作用是:首先从键盘读入一串数字存到字符数组input中,然后转换成整型存到sum中,然后打印出来,一直这样循环下去。scanf("%s", input);这个调用的功能是等待用户输入一个字符串并回车,scanf把其中第一段非空白(非空格、Tab、换行)的字符串放到input数组中,并自动在末尾添加'\0'。接下来的循环从左到右扫描字符串并把每个数字累加到结果中,例如输入是"2345",则循环累加的过程是(((0*10+2)*10+3)*10+4)*10+5=2345。注意字符型的'2'要减去'0'的ASCII码才能转换成整数值的2,'0'的ASCII码是48,而'\0'的ASCII码是0,二者是不同的。下面编译运行程序看看有什么问题:
第一次是对的,第二次就不对。可是这个程序我们并没有忘记赋初值,不仅sum赋了初值,连不必赋初值的i都赋了初值。那么究竟什么地方出错了呢?下面来调试:
首先光标落在代码第5行按F9设置断点
按F5开始调试,程序运行到断点处自动停止。
在VC界面下方的监视区选择自动窗口,可以看到变量i和sum的值。这时候还没有初始化。
按F11逐过程跟踪,程序执行到第7行
观察监视窗口,i和sum已经被赋值。
再次按下F11,光标会移动到第8行,这时我们需要输入数据,输入1234后回车
这时回到VC界面,光标在第9行。观察监视窗口,可以看到我们输入的字符串被保存在数组input中
继续F11知道循环结束。可以看到第一次的结果sum和input数组的内容
下面开始第二次while循环,继续按F11,直到程序运行到第9行,再次输入:
回车后我们先观察调试窗口的内容:
然后开始for循环,我们发现sum的值出现了问题,仍然保留着上次的值,
几个循环之后我们发现了问题的所在:新的转换应该再次从0开始累加,而sum现在已经是1234了,原因在于新的循环没有把sum归零。可见断点有助于快速跳过与问题无关的代码,然后在有问题的代码上慢慢走慢慢分析,“断点加单步”是使用调试器的基本方法。
下面我们修改代码
#include<stdio.h>#include <stdlib.h>int main(void){ intsum = 0, i = 0; charinput[5]; while(1) { scanf("%s", input); sum =0; //对sum进行初始化 for(i = 0; input[i] != '\0'; i++) sum= sum * 10 + input[i] - '0'; printf("input=%d\n", sum); } system("pause"); return0;}
再次运行程序,发现问题已经解决了。
VC环境下调试的原则与方法:
1、 尽量使用快捷键进行调试
2、 观察调试信息
3、 高级中断设置
4、 注意初始化变量,特别是全局变量,malloc的内存,new的内存
8、 边调试边读代码,特别关注堆栈和指针
- C语言入门(20)——使用VC2013对C语言进行调试
- C语言入门(21)——使用DBG对C语言进行调试
- linux下,对c语言程序进行调试
- 对C语言进行调试的最好方法是什么?
- C语言入门(1)——C语言概述
- 使用c语言对mysql进行增删查改
- C语言编程实现使用AES对文件进行加密
- C语言编程实现使用AES对文件进行加密
- c语言—指针(入门1)
- 用c语言对ldap进行操作
- C语言 对字符串进行分割
- C语言编程,对字符串进行处理
- C语言对数据进行扩大
- C语言对图片进行base64编码
- 【C/C++语言入门篇】-- 调试基础
- 【C/C++语言入门篇】-- 调试基础
- 【C/C++语言入门篇】-- 调试基础
- 【C语言】gdb调试器入门
- 119_leetcode_Permutations II
- oracle丢失重做日志的几种恢复方法
- 股息较高企业
- 120_leetcode_Regular Expression Matching
- 磨刀不误砍柴工
- C语言入门(20)——使用VC2013对C语言进行调试
- C语言入门(21)——使用DBG对C语言进行调试
- C语言的本质(1)——计算机与二进制
- 如何查看一个session使用了多少undo
- Swift属性
- 菜鸟学SSH(十三)——Spring容器IOC解析及简单实现
- 容器基础操作1
- C语言的本质(2)——二进制、八进制、十六进制与十进制
- 黑马程序员——OC——ARC内存管理