删除指定字符串:
函数有删除一个字符串的,有删除指定字符串的,注意不同函数的思路。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
/* 方法一:删除全部指定字符串 */
void delString(char *str, char *finstr)
{
char *pstr = strstr(str, finstr);
if (NULL == pstr)
{
printf("没有找到要删除的字符串!");
return;
}
/* 每次从删除后的字符串再查询是否有相应的字符串,如果找到则继续删除 */
/* 这个FOR 效率低,每次都是从开头查询。 */
//for (pstr; pstr != NULL; pstr = strstr(str, finstr))
/* 每次从删除点开始向后查询,这样就可以提高效率,因为前面删除的就不需要再进行查询了 */
/* 只是我们给的这个目标字符串是故意这样设置的,因为删除后又有同样的字符串被组合到了一起 */
for (pstr; pstr != NULL; pstr = strstr(pstr, finstr))
{//保保找到的字符串首地址
char *temp = pstr;
char *ptemp = pstr;
ptemp += strlen(finstr);
while (*temp != '\0')
{
*temp = *ptemp;
temp++;
ptemp++;
}
printf("%s\n", str);
}
}
/* 方法二:全部删除指定字符串 */
void delAllString(char *str, char *chx)
{
int i = 0;
int j = 0;
while ((str[i] = str[j]) != '\0')
{
int flag = 1; //假定找到
//查找,每个字符对比,有一个不等就不等,预防母串提前结束。
for (int k = 0; k < strlen(chx); k++)
{
if (str[j + k] != chx[k] || str[j + k] != '\0')
{
flag = 0;
break;
}
}
if (flag == 0)
{
i++;
j++;
}
else
{
j += strlen(chx); //找到就跳过。
}
}
}
/* 方法一:删除一个字符串 */
void delStr(char *str, char *chx)
{
char *p = strstr(str, chx);
if (NULL == p)
{
return;
}
else
{
int length = strlen(chx); //移动的差距
/* strlen(p) - strlen(chx):需要移动的距离
循环是从查询到的要删除的字符串的开头地址开始循环
*/
for (int i = 0; i <= strlen(p) - strlen(chx); i++)
{
p[i] = p[i + length];
}
}
}
void main()
{
char str[1024] = "ab123aabbeababcab58ab";
char *p = "ab";
printf("原字符串的值:%s\n", str);
//delString(str, p);
delStr(str, p);
printf("删除后字符串:");
printf("%s\n", str);
system("pause");
}