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

#define TRUE 1
#define FALSE 0


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

/**//*********************************************************
主函數*/
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,不進行重復刪除*/
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)/**//***如果當前的主串和子串字符相等*/

{

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

flag = FALSE;/**//*設置為false,防止后續的主串指針,重復移動*/
continue;
}
break;
}

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

{

while(*temp++ = *strP++)/**//***進行字符復制*/

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



















































































說明:
最先str1的定義為 char *,然而就會出現while(*temp++ = *strP++)語句報錯。報錯誤寫入位置 0x00447240 時發生訪問沖突,我的理解是因為字符指針temp指向的是字符串常量,不允許進行修改。所以定義為
char str1 [] 很關鍵。
經上網查資料,解釋是:
C++中數據存儲區分為五種:
棧、堆(new分配)、自由存儲區(malloc分配)、全局/靜態變量存儲區、常量存儲區(不允許修改,除非采用特殊手段)。 字符串這種常量就存在常量區中。全局、靜態變量放在靜態存儲區,而它們是可以被修改的。