计算机等级考试二级上机改错题详细分析5

计算机等级考试二级上机改错题详细分析5,第1张

计算机等级考试二级上机改错题详细分析5,第2张

5.在给定的程序MODI1中。c、fun的作用是找到字符串中最后一个子串的地址,通过函数值返回,在main函数中从这个地址输出字符串;如果没有找到,函数值为空。
例如,当字符串S中的内容是:abcdabfabcdx,子字符串T中的内容是:abc时,输出结果应该是:abcdx。当子串T中的内容为:abd时,输出没有找到信息:Notbe found!。
请纠正fun函数指定部分的错误,使其能够得到正确的结果。
注意:不要改变主函数,不要增删行,不要改变程序的结构!
试题源程序如下:
# include < stdio . h >
/* * * * * * * found * * * * * * */
char fun(char * s,char
a = NULL;
/* * * * * * * * * *找到了* * * * * * * * */
while(s)
{ p = s;r = t;
while(* r)
/* * * * * * * * * * found * * * * * * * * * */
if(r = = p)r++;p++;}
else break;
if(* r = = 0)a = s;
s++;
}
/* * * * * * * * * *找到了* * * * * * * * */
retrun a;
}
main()
{ char s[50]= " abcdabfabcdx ",t[50],* p;
printf("字符串s: %s\n\n ",s);
printf(" Enter substring:");gets(t);
p=fun(s,t);
if(p)printf(" \ n结果为:%s\n ",p);
else printf(" \ n找不到!\ n ");
}分析:(1)编译上述程序,给出错误信息:else放错位置,指出else放错位置;检查else语句,没有问题。看相关的if语句,可以发现if子句应该是一个复合语句,但是缺少左括号,更正一下。
(2)再次编译,函数末尾出错。错误消息:显示未定义的符号“retrun ”,表示错误再次出现。这里,拼错return,更正一下。
(3)编译无误,运行程序,输入子串:abc,输出结果也是:abc,明显错误。需要进一步的检查程序。
(4)在函数中,参数指针S和T分别指向主函数中的主字符串S和子字符串T。为了描述简单,直接称之为S串和T串;函数将P、R和A定义为工作指针。从return语句中,指针A存储字符串中最后一个子串的地址。
(5)在主函数中,fun函数返回的值放在指针P中,所以fun函数的值应该是地址,fun函数的类型应该是指针,其基类是char,但程序中fun函数的类型是char,应该更正为char*。更正后,运行程序仍然不正确。BR> (6)外while循环的判断条件应该是逐个检查S字符串中的字符是否为字符串结束标记,如果是,循环应该结束;这里用s(地址)作为循环控制表达式是不合理的,应该改成* s.
(7)看外层while的循环体。第一条语句将S的当前地址放在P中,T的当前地址放在r中,内嵌的while循环将S字符串和子字符串中的字符逐个进行比较。如果子串结束前有不同的字符,执行break退出这个内循环,S指向下一个字符重新比较;反之,如果相同,R和P同时后移,继续比较,直到子串结束;所以内循环中if语句的表达式应该是* r = = * p;进行更正。
(8)修正后按要求输入子串,得到正确的结果。
(9)提示:虽然本题的改错有一些语法错误,但是要完全得到正确的结果,必须要看程序,懂算法。很难纠正这样的错误。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 计算机等级考试二级上机改错题详细分析5

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情