c语言删除字符串中非字符,C语言,删除字符串中的指定字符,求找错~

你的错误就在于没有充分认识到c语言的字符串是以\0为结束符的

你的移动了字符后,没有在新字符传的尾部加上\0,

导致的结果是输出的数据后面出现有重复的字符。

你的算法存在不足是你出现这个问题的主要原因

你应该这样处理:

循环处理s1的所有字符,如果该字符出现在s2中,那么就不再处理

如果没有出现在s2中,就将该字符保存在第三个字符串中,

最后将第三个字符串的数据尾部增加\0后拷贝到s1中

这个效率要比你的算法效率高,不易出错

下面是实例代码:

/**

* 将字符串s1中的出现在s2中的字符全部删除,并在s1中返回

* @param s1

* @param s2

* @return

*/

char *rm(char *s1, char *s2) {

int iLen1;

int iLen2;

int flag;

int i, j, k;

char *tmp;

char ch;

if ((s1 == NULL) || (s2 == NULL)) {

//字符串有问题

return s1;

}

iLen1 = strlen(s1);

iLen2 = strlen(s2);

//申请临时空间,注意最后要有\0,因此多申请一个

tmp = (char*) malloc((iLen1 + 1) * sizeof (char));

if (tmp == NULL) {

//申请空间失败,没有办法处理了,只好返回NULL

return NULL;

}

k = 0;

for (i = 0; i < iLen1; i++) {

ch = s1[i];

flag = 0;

for (j = 0; j < iLen2; j++) {

if (s2[j] == ch) {

//该字符在s2中出现,不做任何处理

flag = 1;

break;

}

}

if (0 == flag) {

//该字符没有出现在s2中,加入到临时空间中

tmp[k] = ch;

k++;

}

}

//设置结束标志

tmp[k] = '\0';

strcpy(s1, tmp); //拷贝到目标传中

free(tmp); //释放申请的临时空间

return s1;

}

下面是数组的:

/**

* 将字符串s1中的出现在s2中的字符全部删除,并在s1中返回

* @param s1

* @param s2

* @return

*/

char *rm(char s1[], char s2[]) {

int iLen1;

int iLen2;

int flag;

int i, j, k;

char ch;

if ((s1 == NULL) || (s2 == NULL)) {

//字符串有问题

return s1;

}

iLen1 = strlen(s1);

iLen2 = strlen(s2);

k = 0;

for (i = 0; i < iLen1; i++) {

ch = s1[i];

flag = 0;

for (j = 0; j < iLen2; j++) {

if (s2[j] == ch) {

//该字符在s2中出现,不做任何处理

flag = 1;

break;

}

}

if (0 == flag) {

//该字符没有出现在s2中

if (i != k) {

//以前已经删除了一些字符,导致需要调整字符位置了

s1[k] = ch;

}

k++;

}

}

//设置结束标志

s1[k] = 0;

return s1;

}。

全部

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值