《C和指針》第6章編程練習:
請編寫一個函數,刪除一個字符串的一部分,函數的原型如下:
int del_substr(char *str,char const *substr )
函數首先應該判斷substr是否出現在str中,如果它並未出現,函數就返回0;如果出現,函數應該把str 中位於該子串後面的所有字符複製到該子串的位置,從而刪除這個子串,然後函數返回1。如果substr多次出現在str中,函數只刪除第1次出現的子串,函數的第二個參數絕不被修改。
要求:1不能使用任何操縱字符串的庫函數
2 不能使用下標
後面有源碼及註釋
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int del_substr(char *str,char const *substr);//函數聲明
int main()
{
int ret = 0;
char str[20] ;
char substr[20] ;
printf("please input str substr:\n");
scanf("%s%*c",str);
scanf("%s",substr);
printf("str:%s,substr:%s\n",str,substr);
ret = del_substr(str,substr);
printf("the change str:%s\n",str);
printf("%d\n",ret);
return 0;
}
/*
**完成自己的前count個字符比較函數,相同返回0
*/
int my_strncmp(const char *s1,const char *s2,int count)
{
const char *c1 = s1;
const char *c2 = s2;
while(--count&&(*c1 == *c2))
{
c1 ++;
c2 ++;
}
return *c1 - *c2;
}
/*
**完成自己的檢測字符串長度函數,返回字符串長度
*/
int my_strlen(const char *str)
{
const char *s1 = str;
for(s1 = str;*s1 != '\0';s1++)
{
;
}
return s1 - str;
}
/*
**刪除字符串函數,成功返回1,str中刪除第一個出現的substr;失敗返回0,str不變
*/
int del_substr(char *str,char const *substr)
{
int flag = 0;//控制只刪除一次的變量
char *ptr = str;
char *src = str;
int len = my_strlen(substr);
while(*src != '\0')
{
if(flag == 0&&my_strncmp(src,substr,len) == 0)
{
src = src + len;//匹配成功,src的指向後移len
flag = 1;
}
*ptr++ = *src++;//將src指向的字符賦給ptr指向的字符
}
*ptr = '\0';
str = ptr;//將修改好的字符串賦給str
if(flag == 1)//如果字符串被改動過一次,返回1
{
return 1;
}
return 0;
}