c和指针 又一个题目 <感觉自己很笨,代码写的很繁琐,而且传入参数为'\0'时,程序直接崩溃了>
程序代码:#include <stdio.h>
/*
c和指针习题二:
函数首先应该判断substr是否在str中,如果它并未出现 则返回0
如果出现了,则函数应该把str中位于该子串后面的所有字符复制
到该子串位置,然后返回1,如果substr多次出现于str中,则后面
的被忽略,也就是只有第一个被覆盖,函数的第二个参数绝对不能
被修改。
要求1、要使用指针操作字符串而不是使用数组下标
要求2、不能使用已知的库函数操作字符串
提示1、空字符串是每个字符串的子串,也就是说如果第2个参数是
空字符串 则源串不发生变化
*/
int del_substr(char* str,const char* substr)
{
/*
if(*substr=='\0') //这个比较会导致程序崩溃
{
return 0;
}
*/
int i=0,j;
int s_len=0;
int sub_len=0;
bool flag=true; //标记子串是否在源串中
char* p_s=str; //临时指针
const char* p_sub=substr; //临时指针
while(*p_s!=NULL)
{
s_len++;
*p_s++;
} //计算源串长度
while(*p_sub!=NULL)
{
sub_len++;
*p_sub++;
} //计算子串长度
p_sub=substr;
p_s=str;
if(sub_len>=s_len) return 0; //如果子串长度大于等于源串长度 直接返回
while(i<s_len-sub_len)
{
for(j=0;j<sub_len;j++) //这个循环用于判断子串是否在源串之间被包含
{
if(*p_s!=*p_sub)
{
flag=false;
break;
}
*p_s++;
*p_sub++;
}
if (flag==true) //下面几句代码实现的是子串后面的串向前移动
{
char* p_tmp=str+sub_len;
for(j=0;j<s_len-sub_len-i;j++)
{
*str=*p_tmp;
str++;
p_tmp++;
}
*str='\0';
return 1;
}
i++; //下面几句也是用于用于判断子串是否在源串之间被包含
if(i!=s_len-sub_len) flag=true;
p_sub=substr;
p_s=++str; //一个一个的移动源串指针 用于用于判断子串是否在源串之间被包含
}
return 0;
}
int main(void)
{
char a[]="abcdefgfgjldk"; //看起来这个只能用数组传入了,否则无法移动子串
//那么前一道题目如果用数组传入 将会变得很简单
char* b="1234";
char* c="def";
char* d='\0';
int i=0,j=0;
//i=del_substr(a,b);
j=del_substr(a,c); //这个语句可以测试成功
printf("%s\n",a);
//j=del_substr(a,d); //这个语句无法测试成功
//printf("%s\n",a);
return 0;
}









