題目:
請編寫一個(gè)函數(shù),刪除一個(gè)字符串的一部分。函數(shù)原型如下:
int del_substr(char *str, char const *substr)
函數(shù)首先應(yīng)判斷substr是否出現(xiàn)在str中。如果它并未出現(xiàn),函數(shù)就返回0;如果出現(xiàn),函數(shù)應(yīng)該把str中位于該子串后面的所有字符復(fù)制到該子串的位置,從而刪除這個(gè)子串,然后函數(shù)返回1。如果substr多次出現(xiàn)在str中,函數(shù)只刪除第1次出現(xiàn)的子串。函數(shù)的第2個(gè)參數(shù)絕不會被修改。
舉個(gè)例子,假定str指向ABCDEFG。如果substr指向FGH、CDF或XABC,函數(shù)應(yīng)該返回0,str未作任何修改。但如果substr指向CDE,函數(shù)就把str修改為指向ABFG,方法是把F、G和結(jié)尾的NUL字節(jié)復(fù)制到C的位置,然后函數(shù)返回1。不論出現(xiàn)什么情況,函數(shù)的第2個(gè)參數(shù)都不應(yīng)該被修改。
要求:a.你不應(yīng)該使用任何用于操縱字符串的庫函數(shù)(如strcpy, strcmp, 等)。
b.函數(shù)中的任何地方都不應(yīng)該使用下標(biāo)引用。
一個(gè)值得注意的是,空字符串是每個(gè)字符串的一個(gè)子串,如果字符串中刪除一個(gè)空字符串不會產(chǎn)生變化。
算法:
#include <stdlib.h>
#include <stdio.h>

#define TRUE 1
#define FALSE 0


/**//*********************************************************
函數(shù)聲明*/
int del_substr(char *str, char const *substr);

/**//*********************************************************
主函數(shù)*/
int main()


{
char str1 [] = "aabcdefgh324";
char const * str2= "abc";

printf("before delete: %s\n", str1);
printf("will delete che chars: %s\n", str2);
del_substr(str1, str2);
printf("After delete: %s\n", str1);

system("pause");
return 0;
}

/**//***刪除字符串str中包含的子串substr,不進(jìn)行重復(fù)刪除*/
int del_substr(char *str, char const *substr)


{
char const * subP;
char *strP;
char *temp;
int flag = TRUE;

strP = str;

if((!*str) || *substr == '\0')/**//***如果主串為空或子串為空字符串,則返回*/
return FALSE;

while(*strP)

{
temp = strP;
for(subP=substr; *subP; subP++)

{

if(*strP == *subP)/**//***如果當(dāng)前的主串和子串字符相等*/

{

strP++;/**//***則主串指針向前移一個(gè)字符*/

flag = FALSE;/**//*設(shè)置為false,防止后續(xù)的主串指針,重復(fù)移動*/
continue;
}
break;
}

if(*subP == '\0') /**//***如果subP指向末尾的'\0'則表示子串匹配成功*/

{

while(*temp++ = *strP++)/**//***進(jìn)行字符復(fù)制*/

;/**//***空語句*/
break;
}
if(flag)
strP++;
}
return TRUE;
}
說明:
最先str1的定義為 char *,然而就會出現(xiàn)while(*temp++ = *strP++)語句報(bào)錯(cuò)。報(bào)錯(cuò)誤寫入位置 0x00447240 時(shí)發(fā)生訪問沖突,我的理解是因?yàn)樽址羔榯emp指向的是字符串常量,不允許進(jìn)行修改。所以定義為
char str1 [] 很關(guān)鍵。
經(jīng)上網(wǎng)查資料,解釋是:
C++中數(shù)據(jù)存儲區(qū)分為五種:
棧、堆(new分配)、自由存儲區(qū)(malloc分配)、全局/靜態(tài)變量存儲區(qū)、常量存儲區(qū)(不允許修改,除非采用特殊手段)。 字符串這種常量就存在常量區(qū)中。全局、靜態(tài)變量放在靜態(tài)存儲區(qū),而它們是可以被修改的。
請編寫一個(gè)函數(shù),刪除一個(gè)字符串的一部分。函數(shù)原型如下:
int del_substr(char *str, char const *substr)
函數(shù)首先應(yīng)判斷substr是否出現(xiàn)在str中。如果它并未出現(xiàn),函數(shù)就返回0;如果出現(xiàn),函數(shù)應(yīng)該把str中位于該子串后面的所有字符復(fù)制到該子串的位置,從而刪除這個(gè)子串,然后函數(shù)返回1。如果substr多次出現(xiàn)在str中,函數(shù)只刪除第1次出現(xiàn)的子串。函數(shù)的第2個(gè)參數(shù)絕不會被修改。
舉個(gè)例子,假定str指向ABCDEFG。如果substr指向FGH、CDF或XABC,函數(shù)應(yīng)該返回0,str未作任何修改。但如果substr指向CDE,函數(shù)就把str修改為指向ABFG,方法是把F、G和結(jié)尾的NUL字節(jié)復(fù)制到C的位置,然后函數(shù)返回1。不論出現(xiàn)什么情況,函數(shù)的第2個(gè)參數(shù)都不應(yīng)該被修改。
要求:a.你不應(yīng)該使用任何用于操縱字符串的庫函數(shù)(如strcpy, strcmp, 等)。
b.函數(shù)中的任何地方都不應(yīng)該使用下標(biāo)引用。
一個(gè)值得注意的是,空字符串是每個(gè)字符串的一個(gè)子串,如果字符串中刪除一個(gè)空字符串不會產(chǎn)生變化。
算法:



















































































說明:
最先str1的定義為 char *,然而就會出現(xiàn)while(*temp++ = *strP++)語句報(bào)錯(cuò)。報(bào)錯(cuò)誤寫入位置 0x00447240 時(shí)發(fā)生訪問沖突,我的理解是因?yàn)樽址羔榯emp指向的是字符串常量,不允許進(jìn)行修改。所以定義為
char str1 [] 很關(guān)鍵。
經(jīng)上網(wǎng)查資料,解釋是:
C++中數(shù)據(jù)存儲區(qū)分為五種:
棧、堆(new分配)、自由存儲區(qū)(malloc分配)、全局/靜態(tài)變量存儲區(qū)、常量存儲區(qū)(不允許修改,除非采用特殊手段)。 字符串這種常量就存在常量區(qū)中。全局、靜態(tài)變量放在靜態(tài)存儲區(qū),而它們是可以被修改的。