关于删除一个字符串的一部分的程序
#include <iostream>
using namespace std;
int del_substr(char *str,char *substr)
{
int count=0;
char *flag=str,*flag1=str;
char *p1=NULL,*p2=NULL;
p1=str;
for (p1=str;p1<str+strlen(str);)//遍历str,找到第一个和substr中的第一字母相同的字母就break ;
if (*p1++==*substr)
{
flag1=flag=--p1;//找到就标记为flag和flag1;
break;
}
}
for (p2=substr;p2<substr+strlen(substr);)
{
if (*p2++==*flag++) count++;//从flag位置开始,看substr中的字母是不是喝flag之后的字母一样
}
if(count==strlen(substr)) //如果count与strlen(substr)一样,就表示:substr是str中的子串
{
char ch;
while (*flag != '\0')//从flag开始,想前移动strlen(substr)个位置。
{
*flag1++=*flag++; //!!!!!!!!!!!!!!!错误之处
cout<<*flag<<endl;
system("pause");
flag1++;
flag++;
}
cout<<str<<endl;
return 1;
}
else
return 0;
}
int main(void)
{
char *str="abcdefg";
char *substr="cde";
// char *c=NULL;
// c=del_substr(str,substr);
cout<<del_substr(str,substr)<<endl;
return 0;
}
这是《c和指针》第六章课后编程习题的第二题,求指教,为什么错误!谢谢~!
[解决办法]
在子函数int del_substr(char *str,char *substr)中
调用 strlen(str) , strlen(substr) 合适吗?
不如将两个字符串的长度作为函数参数传递过去更加安全。
感觉 代码的逻辑也有点乱
可以这样考虑
对于str进行遍历,寻找符合 substr第一个字符的位置
如果符合第一个了,那么两个指针同时后移,比对第2个,……
在某一个点出现不匹配,立刻返回本层循环,进行第一个比对……
直到出现 完全匹配,记录位置
全部遍历完成后,根据记录的位置进行处理
可以原地工作进行拷贝,也可以借助临时空间
不要忘记最后在str后面加结束标志
楼主是这样考虑的吗?
代码贴的有点乱,我看的不是很清楚
[解决办法]
int del_substr(char * str, char * substr, int len_str, int len_substr){ char * p2str = str; char * p2substr = substr; char * p2del = null; int i, j; if (str == null || substr == null) return error; if (len_str < len_substr) return error; for (i=0; i<len_str; i++) { if (*p2str == *p2substr) { p2del = p2str; for (k=1; k<len_substr; k++) { if (p2str[k] != p2substr[k]) break; } if (k == len_substr) { memcpy(p2del, p2del+len_substr, len_str-i-len_substr+1); len_str -= len_substr; } } if (len_str < len_substr) break; } return OK;}
[解决办法]