5、給定程序MODI1.C中,函數(shù)fun的功能是:求出在字符串中最后一次出現(xiàn)的子字符串的地址,通過函數(shù)值返回,在主函數(shù)中輸出從此地址開始的字符串;若未找到則函數(shù)值為NULL。
例如,當(dāng)字符串s中的內(nèi)容為:abcdabfabcdx,子串t中的內(nèi)容為:abc時,輸出結(jié)果應(yīng)為:abcdx。當(dāng)子串t中的內(nèi)容為:abd時,輸出未找到信息:Notbe found!。
請改正函數(shù)fun中指定部位的錯誤,使它能得出正確的結(jié)果。
注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
#include <stdio.h>
/**********found**********/
char fun( char *s, char *t )
{ char *p, *r, *a;
a=NULL;
/**********found**********/
while( s )
{ p=s; r=t;
while(*r)
/**********found**********/
if( r==p ) r++; p++; }
else break;
if( *r==0 ) a=s;
s++;
}
/**********found**********/
retrun a;
}
main()
{ char s[50]= "abcdabfabcdx", t[50], *p;
printf("The string s: %s\n\n",s );
printf("Enter substring: "); gets(t);
p=fun(s,t);
if(p)printf("\nThe result is: %s\n", p );
else printf("\nNot be found !\n");
}分析:(1)對以上程序進(jìn)行編譯,給出出錯信息:Misplaced else,指出else放錯了位置;檢查else語句,本身沒有錯,察看有關(guān)的if語句,可以發(fā)現(xiàn)if子句應(yīng)是一個復(fù)合語句,但缺了左括號,進(jìn)行改正。
(2)再次進(jìn)行編譯,在函數(shù)的最后出錯,顯示出錯信息:Undefined symbol 'retrun',指出錯在retrun。在此把return拼錯,進(jìn)行改正。
(3)編譯無錯,運(yùn)行程序,輸入子串:abc,輸出結(jié)果也是:abc,顯然不對。需進(jìn)一步檢查程序。
(4)函數(shù)中,形參指針s、t分別指向主函數(shù)中的主串s和子串t,為敘述簡單,直接稱s串和t串;函數(shù)中定義p、r和a為工作指針,從return語句看,指針a存放字符串中最后一次出現(xiàn)子字符串的地址。
(5)主函數(shù)中,fun函數(shù)返回的值放在指針p中,因此fun函數(shù)值應(yīng)是地址,fun函數(shù)的類型應(yīng)是基類型為char的指針,但是程序中fun函數(shù)的類型為char,應(yīng)當(dāng)改正為char*。改正后運(yùn)行程序,仍不正確<絳觳槌絳頡?BR> (6)外層while循環(huán)的判斷條件應(yīng)當(dāng)是逐個檢查s串中的字符是否為字符串結(jié)束標(biāo)志,若是字符串結(jié)束標(biāo)志則循環(huán)應(yīng)結(jié)束;而此處用s(地址)作為循環(huán)控制表達(dá)式是不合理的,應(yīng)該改為*s。
(7)查看外層while的循環(huán)體,第一條語句在p中放入s當(dāng)前所指地址,在r中放入t當(dāng)前所指地址。內(nèi)嵌的while循環(huán)體把s串和子串中的字符逐個進(jìn)行比較,如果在子串結(jié)束前有不同的字符,則執(zhí)行break退出此內(nèi)循環(huán),s指向下一個字符重新再比較;反之,若相同,則r和p同時向后移,繼續(xù)比較直到遇到子串結(jié)束;因此內(nèi)循環(huán)中if語句的表達(dá)式應(yīng)是*r==*p;進(jìn)行改正。
(8)改正后按要求輸入子串,得到正確結(jié)果。
(9)提示:本題的改錯雖有語法錯的部分,但要完全得到正確結(jié)果,必須讀懂程序,理解算法。這樣的改錯題有一定的難度。
例如,當(dāng)字符串s中的內(nèi)容為:abcdabfabcdx,子串t中的內(nèi)容為:abc時,輸出結(jié)果應(yīng)為:abcdx。當(dāng)子串t中的內(nèi)容為:abd時,輸出未找到信息:Notbe found!。
請改正函數(shù)fun中指定部位的錯誤,使它能得出正確的結(jié)果。
注意:不要改動main函數(shù),不得增行或刪行,也不得更改程序的結(jié)構(gòu)!
試題源程序如下:
#include <stdio.h>
/**********found**********/
char fun( char *s, char *t )
{ char *p, *r, *a;
a=NULL;
/**********found**********/
while( s )
{ p=s; r=t;
while(*r)
/**********found**********/
if( r==p ) r++; p++; }
else break;
if( *r==0 ) a=s;
s++;
}
/**********found**********/
retrun a;
}
main()
{ char s[50]= "abcdabfabcdx", t[50], *p;
printf("The string s: %s\n\n",s );
printf("Enter substring: "); gets(t);
p=fun(s,t);
if(p)printf("\nThe result is: %s\n", p );
else printf("\nNot be found !\n");
}分析:(1)對以上程序進(jìn)行編譯,給出出錯信息:Misplaced else,指出else放錯了位置;檢查else語句,本身沒有錯,察看有關(guān)的if語句,可以發(fā)現(xiàn)if子句應(yīng)是一個復(fù)合語句,但缺了左括號,進(jìn)行改正。
(2)再次進(jìn)行編譯,在函數(shù)的最后出錯,顯示出錯信息:Undefined symbol 'retrun',指出錯在retrun。在此把return拼錯,進(jìn)行改正。
(3)編譯無錯,運(yùn)行程序,輸入子串:abc,輸出結(jié)果也是:abc,顯然不對。需進(jìn)一步檢查程序。
(4)函數(shù)中,形參指針s、t分別指向主函數(shù)中的主串s和子串t,為敘述簡單,直接稱s串和t串;函數(shù)中定義p、r和a為工作指針,從return語句看,指針a存放字符串中最后一次出現(xiàn)子字符串的地址。
(5)主函數(shù)中,fun函數(shù)返回的值放在指針p中,因此fun函數(shù)值應(yīng)是地址,fun函數(shù)的類型應(yīng)是基類型為char的指針,但是程序中fun函數(shù)的類型為char,應(yīng)當(dāng)改正為char*。改正后運(yùn)行程序,仍不正確<絳觳槌絳頡?BR> (6)外層while循環(huán)的判斷條件應(yīng)當(dāng)是逐個檢查s串中的字符是否為字符串結(jié)束標(biāo)志,若是字符串結(jié)束標(biāo)志則循環(huán)應(yīng)結(jié)束;而此處用s(地址)作為循環(huán)控制表達(dá)式是不合理的,應(yīng)該改為*s。
(7)查看外層while的循環(huán)體,第一條語句在p中放入s當(dāng)前所指地址,在r中放入t當(dāng)前所指地址。內(nèi)嵌的while循環(huán)體把s串和子串中的字符逐個進(jìn)行比較,如果在子串結(jié)束前有不同的字符,則執(zhí)行break退出此內(nèi)循環(huán),s指向下一個字符重新再比較;反之,若相同,則r和p同時向后移,繼續(xù)比較直到遇到子串結(jié)束;因此內(nèi)循環(huán)中if語句的表達(dá)式應(yīng)是*r==*p;進(jìn)行改正。
(8)改正后按要求輸入子串,得到正確結(jié)果。
(9)提示:本題的改錯雖有語法錯的部分,但要完全得到正確結(jié)果,必須讀懂程序,理解算法。這樣的改錯題有一定的難度。