《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;
}