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、 边调试边读代码,特别关注堆栈和指针

 

0 0