C语言入门(20)——使用VC2013对C语言进行调试


软件调试过程中,有时会一些逻辑和内存访问方面的问题,如果没有调试器的帮助,找出何处代码导致这块内存被更改是一件非常麻烦的事情。恰当运用数据断点可以快速帮我们定位问题的所在。

 

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

 

转载于:https://www.cnblogs.com/new0801/p/6177126.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值