請編寫一個函式,刪除一個字串的一部分。函式原型如下:
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.函式中的任何地方都不應該使用下標引用。
一個值得注意的是,空字串是每個字串的一個子串,如果字串中刪除一個空字串不會產生變化。
/*
** Delete a portion of a string.
*/
#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
int del_substr(char *str, char const *substr);
int main()
{
char str1 [] = "xyzabcjklmn";
char const * str2= "axc";
int ret;
printf("before delete: %s\n", str1);
printf("will delete che chars: %s\n", str2);
ret = del_substr(str1, str2);
printf("After delete : %s\n", str1);
printf("ret = %d\n", ret);
system("pause");
return 0;
}
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;
continue;
}
break;
}
if(*subP == '\0')
{
flag = FALSE;
while(*temp++ = *strP++)
;
break;
}
if(flag)
strP++;
}
if(*strP == '\0' && *subP != '\0')
{
return FALSE;
}
return TRUE;
}
源程式借鑑於:http://blog.sina.com.cn/s/blog_798f21a00100wy2i.html
主要做了兩處修改:(這樣才滿足題意要求)
flag=FALSE;由原來藍色處移到現在的紅色字型處;
另外新增了
if(*strP == '\0' && *subP != '\0')
{
return FALSE;
}