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
文章评论
共有 0 位网友发表了评论
用户名: 新注册) 密码: 匿名评论 [查看所有评论]

评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
您可以用以下几种方式找到此文章

考试全流程