从2008年4月开始,全国计算机等级考试将全面停止Turbo C2.0(简称TC)软件的使用,所有参加二级C语言、三级信息技术、网络技术和数据库技术上机考试的考生,都要在Visual C++6.0(简称VC)环境下调试运行C程序。众所周知,VC软件主要是用来开发C++程序的,如何在VC下调试运行C程序,对于众多程序设计者来说,确实是一个新的话题。
VC与TC的差异,主要是体现在程序设计语言C++与C的关系上。其实,了解计算机程序设计的人都知道,C++是C语言的升级板,VC是在Windows进行C++程序设计的主要软件,VC完全兼容了C的功能,也就是说,在VC下是完全能够进行C语言程序开发。
一、在VC下运行一个C程序
1.启动VC
启动VC的前提是首先要安装VC软件。如果你的系统安装了VC软件,当你启动了Windows系统之后,从“开始”菜单进入“所有程序”子菜单,找到Microsoft Visual C++ 6.0并单击它即进入VC软件的主窗口,如图1所示:
微型编译条工具栏 |
图1
图2
2.编辑程序
若要在VC窗口下进行C程序的编辑,首先,单击工具栏的New Text File按钮,生成一个新的文本文件窗口,如图2所示;接着,单击Save按钮,激活“保存为”对话框,在指定的文件夹下,输入当前程序的文件名(注意:文件名必须给出.C的扩展名),再按“保存”按钮。到此为止,在指定的目录下,就生成了一个由读者自己命名的C文件(比如C001.C),接下来,就可以进入编辑屏幕输入你的C源程序了。
由于当前的文件是C源程序文件,在其中输入的任何内容(如:关键字、用户标识符及各种运算符),VC系统都会按C源程序的格式进行编排、组织。比如:在文件中,当你输入了一个C关键字时,VC系统自动将其设定为蓝色字体以示区别;在编辑过程中,如果你输入了一个块结构语句(如:for(i=0;i<10;i++)、if(s!=’\0’)、while(k<5)),按回车后,VC系统会把光标定位在该块语句起始位置开始的下一行的每五个字符位置上,以表示下面输入的内容是属于该块语句的,以体现C源程序的缩进式书写格式;此时,如果输入一个左花括号“{”并回车,VC系统将把该花括号左移到与上一行块语句起始位置对齐的位置上;接着,再按下回车键,VC系统会自动采用缩进格式,将当前光标位置定位在此花括号的下一行的第五列上;如果上一行语句与下一行语句同属于一个程序段(比如:同一个复合语句中的语句),VC系统会自动将这两个程序行的起始位置对齐排列;……更详细的内容请读者自行上机实习,并认真体会其中的输入技巧。
3.编译程序
程序编辑完后,即可对源程序进行编译处理。按“编译微型条”(图2所示)的Compile(功能键是Ctrl+F7)按钮,对程序进行编译,这时,屏幕上出现如图3所示的对话框,让建立一个默认的工程工作区,选“是”按钮确认;紧接着,又出现如图4所示的对话框,问是否要保存当前的C文件,回答“是”;然后,系统开始编译当前程序。如果程序正确,即程序中不存在语法错误,则VC窗口的输出如图5所示的结果。
图3
图4
图5
输出窗口 |
如果程序中存在语法错误,则在VC的输出窗口显示如图6所示的错误信息。这些信息告诉我们:在编译C001.C的程序时出现错误;错误行是第7行;错误原因是标识符printf前面丢了分号“;”。按照错误提示修改程序,再一次按Ctrl+F7进行编译,直到不存在语法为止。
4.运行程序
当程序编译提示无错误信息(0 error(s))后,按下微型编译条工具栏上的“建立执行程序”(BuildExecute)按钮 ,或相应的功能键Ctrl+F5,程序开始运行,然后显示程序的输出结果如图7所示。输出结果的屏幕将等待用户按下任意键后,才返回编辑状态,一个C程序的执行过程结束。
图6
图7
二、在VC下调试C程序的方法
1.VC调试功能简介
当一个C源程序编辑完成之后,你可以用上节讲的方法进行编译、运行。如果程序无编译错误,但无运行结果,或运行结果有误时,你就需要调用VC的编译调试工具来调试你的程序,以便找出出错的原因,从而达到正确的运行结果。
VC为调试C程序提供了多种工具和多组方法,常用的方法有菜单法、工具栏法和功能键法。实际上,这三种方法是相似或相同的,只是根据用户的熟悉程度和习惯用法选择其中之一,来完成你的调试过程。作者习惯使用功能键法,因为使用功能键既方便操作,又能节省调试程序的时间,使调试过程在较短的时间内完成。下面结合调试工具来介绍以上立法。
在VC窗口下的菜单栏和工具栏的空白处,点右键激活快捷菜单,选择“编译”菜单项,这时VC窗口就出现了调试工具栏,如图8所示。
图8
调试工具栏中的工具可分为两部分:控制程序运行工具和设置观察窗口工具。
① 对于控制程序运行工具,从左到右的常用按钮、功能键及功能说明依次是:
●Restart 重新执行程序,功能键是 Ctrl+Shift+F5。无论C源程序处于任何状态(编辑、运行、调试),按下此按钮均可使程序从编译开始,逐步进入调试程序状态。
●Stop Debugging 停止程序调试,功能键是Shift+F5。当调试过程处于跟踪程序执行的状态时,按下此按钮,将停止调试程序,返回编辑状态。编辑状态下此按钮无效。
● Show Next Statement 指示当前程序运行的语句行。
● Step Into 单步运行并且可进入函数内部运行,功能键是F11。程序在调试过程中,按下此按钮可单步跟踪程序运行,与Stp Over按钮不同的是,该功能可进入函数内部,继续函数内部的语句行跟踪。
注意:使用此按钮时,当 位于有库函数调用的语句行,不用F11功能,以免进入库函数的汇编程序块中,取而代的是F10功能键。
● Step Over 单步运行程序,功能键是F10。本按钮的功能类似于F11,但它不进入函数内部,它将每一条语句看作一步,包括函数调用语句。
●Step Out 从当前函数中退出,功能键是Shift+F11。当程序运行至某个函数内部时,按下此按钮后,调试状态即从函数内部退出,返回到调用该函数的主函数的当前语句。
●Run to Cursor 运行到当前光标位置,功能键是Ctrl+F10。当程序处于调试状态时,为了跳过某程序段,可预先将光标定位在某语句行上,按下此按钮,即可使程序直接运行到当前光标位置,从而节省了时间,加快了调试程序的步骤。
② 对于设置观察窗口工具,其功能主要是为配合程序跟踪运行,设置一些观察点,以便定位出错的位置,从而找到出错的原因。
● QuickWatch 快速观察表达式的值,功能键是Shift+F9。当程序运行到某个关键语句行时,你可以按下该按钮,即在屏幕上显示如图9所示的“QuickWatch”窗口,其中:E表达式下拉列表框中的a,是由用户输入的当前源程序中的一个数组名;V 当前值列表中的“Name”和“Value”列的值就是a数组中所有元素的元素名和元素值。
图9
●Watch 设置观察点。当用户按下该按钮,屏幕显示如图10所示观察窗口,其中的“Name”列和“Value”列为空。这时,用户可以在Name列中输入用户待观察的观察点,即程序中某个变量的名字,然后回车,在Value列就显示出该变量的当前值。观察点可以设置多个,多个观察点还可以分别放在不同的观察标签内(Watch1、Watch2…)。
图10
● Variables 变量列表,当按下此按钮,屏幕显示如图11所示的变量列表窗口。窗口中的“Name”列和“Value”列中列出了当前函数中的所有变量名和相应的值,其中:简单变量只显示变量名和它的值;数组名前面有一个“ ”符号,Value列显示它的地址值。
图11
●Registers 寄存器列表,按下此按钮,屏幕上显示如图12所示的寄存器窗口,窗口中列出了所有寄存器的内容。
图12
●Memory 内存列表,按下此按钮,屏幕上显示如图13所示的内存列表窗口,其中“A地址”文本框中显示的是内存的当前地址值,下面的列表框中显示的是从指定地址开始的所有内存区域的值,??表示其值不确定(没有赋确定的值)。用户可以在程序运行时,在“Watch”窗口中找到某个变量的地址或数组名的值(数组名本身是一个地址量),然后,将该值输出“A地址”的文本框中,在内存列表区立即就能看到它的存储值,不过该值是一个十六进制的数,并且,一个整型数占据四个字节的存储区域。详细内容可参考下面的例子。
图13
2.使用VC调试C程序的方法
以下程序是全国计算机等级考试二级C语言的一道上机改错题,请考生调试该程序,使其能按要求输出正确的结果。
① 程序功能说明
给定程序C003.C中函数fun的功能是:从s所指字符串中,找出t所指子串的个数作为函数值返回。
例如,当s所指字符串中的内容为:"abcdabfab",t所指字符串的内容为:"ab",则函数返回整数3。
请改正程序中的错误,使它能得出正确的结果。
注意: 不要改动main函数, 不得增行或删行, 也不得更改程序的结构!
② 源程序
#define N 80
int fun(char *s, char *t)
{
int n=0; char *p , *r;
while ( *s )
{
p=s;
r=p;
while(*r)
if(*r==*p)
{
r++;
p++;
}
else break;
if(*r = O)
n++;
s++;
}
return n;
}
main()
{
char a[N],b[N]; int m;
printf("Enter string a : ");
gets(a);
printf("Enter substring b : ");
gets( b );
m=fun(a, b);
printf(" The result is : m=%d ",m);
}
③ 调试过程
a) 启动VC系统,编辑输出源程序,并以c003.c命名,结果如图14所示。
图14
b) 按功能键Ctrl+F11编译源程序,编译显示结果如图15所示。
图15
编译结果告诉我们,程序中存在一个错误,两个警告。其中:警告的原因都是因为系统函数没有包含头文件stdio.h,错误的原因是第16行的标识符(identifierf)’O’没有定义。需要说明的是,这里的错误很特别:从程序字面上看,这里的O好象是数字0,而一般考生也分辨不出或不会认为是O。但是,既然编译系统给出错误信息,就应该根据该错误信息来修改程序。在源程序前面增加一行文件包含命令“#include ”,再把字母O改写成字符0(这是缺乏编程经验的考生的共同作法),再一次编译程序,结果告诉我们程序编译成功。
然后,按Ctrl+F5功能键,运行程序,在提示输入的屏幕上输入题目要求的两个字符串,屏幕显示如图16所示,结果再一次告诉考生:程序结果有错,即程序中存在逻辑错误。
图16
c) 接下来,我们对程序作运一步调试,以找出程序出错的真正原因。
调试一个存在逻辑错误的程序,首先要确定程序中可能出现错误的大概位置。根据题意说明可确定错误存在于函数fun中。根据这一判断,我们先将光标定位在fun函数的第一条可执行的语句行上,然后,按下功能键Ctrl+F10,让程序运行到光标位置。注意:这个过程中间要进入输入屏幕状态,等待输入a和b字符串,请考生按要求输入,用回车符确认。当看到任务栏的VC图标在闪烁,请将窗口切换到VC状态,如图17所示:
图17
接下来,边按功能键F10,边观察屏幕下方变量(Variables)子窗口中p字符串和r字符串的变化,同时还要注意VC窗口左边的黄色指点针箭头。一直重复以上过程,你会发现,黄色箭头始终没有指向“n++;”语句。我们要找的第一个逻辑错误点就是if语句后面的表达式。按照正常的情况,if后面的表达式应该是关系表达式或逻辑表达式,而这里的表达式是赋值表达式,正确的语句应该是:
if(*r == 0)
n++;
修改之后再按Ctrl+F5运行程序,程序结果如图18所示。
为了利用VC的调试功能和手段,更好地观察其它相关变量的变化规律,在上述过程中,还可以在VC的观察(Watch)窗口输入其它变量,在跟踪程序执行过程中观察其变化。
图18
这种结果也不对,这是第一次错误结果的另一个极端:从m=0变到m=10。
如何查找其中的原因?不仿再回顾一下刚才在跟踪程序运行时,变量(Variables)窗口中的p和r字符串的值的变化情况,再结合程序中r字符串的作用,不难看出,p和r应该是不同的字符串,且p字符串是指向s字符串,而r字符串则应该指向t字符串。正确的结果应该是:将语句“r=p;”改成“r=t;”。
至此,一个存在错误的C程序的调试过程结束,运行该程序,即可得到正确的运行结果。需要说明的是,以上调试的程序只是一个简单的例子,其中用到的调试方法也是经常使用的方法之一,若要真正掌握在VC下调试C程序的方法和步骤,需要读者进行大量的上机实践和练习。
转自http://www.cnblogs.com/chenyadong/archive/2011/10/11/2207941.html