C语言部分上机改错题详细分析
出处:www.examlink.com 作者:小罗 日期:2007年01月23日 13时25分
|
4、给定程序MODI1.C中,函数fun的功能是:从字符串s中删除所有小写字母c。主函数中已给s赋字符串:cabcdabcdabcxccc,输出结果应该是:abdabdabx。 请改正函数fun中的错误,使它能得出正确的结果。 注意:不要改动main函数,不得增行或删行,也不得更改程序的结构! 试题源程序如下: /**********found**********/ include "stdio.a"; void fun(char s) { int i,j; for(i=j=0;s[i];i++) if(s[i]!='c') /**********found**********/ s[j]=s[i]; /**********found**********/ s[i]=0; } main() { char s[80]="cabcdabcdabcxccc"; printf("The original string:");puts(s); fun(s); printf("The string after deleted:");puts(s);printf("\n\n"); }分析:(1)当对以上程序进行编译时,给出的第一个出错信息是:Declaration syntax error,指出在include行有语法错。观察此行首先可以发现在include之前没有"#"号,在此行的末尾多了分号,对此进行修正。再进行编译,给出出错信息:Unable to open include file'STDIO.A',指出打不开名为'STDIO.A'的include文件。可以发现在此错把stdio.h文件的后缀写成了".a",进行改正。 (2)再次进行编译时给出了出错信息:Invalid indirection,指出for语句中的s[i]为非法的标识符。在此s[i]以带下标的形式表示字符串中的某个元素,并作为循环结束标志,当s[i]中的值为0时循环结束,也就是说,遇到字符串结束标志时循环结束;观察形参s,仅说明它是一个字符变量,当然不可以使用s[i]的形式,而对应的实参却是一个字符数组名,显然,形参应定义成:char*s,进行修改后编译不再有错。 (3)运行程序,输出结果是:xabcdabcdabcxccc,与预定的结果不符。应进一步检查函数fun中的逻辑结构。检查程序可知在for循环中,通过下标i用if语句来逐个检查s所指字符串中的每个字符是否为小写的字母c,若不是,就重新放回s所指字符数组中,所放位置由下标j来指定;i由for循环变量来控制变化,而j除了赋过初值外,没有改变过,因此,只要不是小写字母c就不断重复放在s[0](因为j一直为0)中,只有s[0]中的字符改变,其他位置上的内容都没有改变。应该每在s[j]中放入一个非小写字母c之后,使j增1,if子句中的s[j]=s[i];应改写为:s[j++]=s[i];,或改写为:{s[j]=s[i];j++;}。 (4)改正后,再次运行程序,输出的字符串为:abdabdabxabcxccc,与预定的结果也不相同。但可以看到字符串的前部分是正确的,应当考虑字符串结束标志是否放错了位置;检查函数中最后的语句s[i]=0;可见,字符串结束标志没有放在由j所指的字符串的最后,而是仍放在原串的最后了,因此,此语句应该成s[j]=0;。 (5)改正后,再次运行程序,得到了正确的结果:abdabdabx。 (6)提示:本题中出现的错误基本是逻辑错,对于这样的试题,要求考生能够读懂程序,分析算法方面的错误进行改正。
最后更新时间:2008-05-28 11:40:36
|