C语言,删除字符串中的指定字符,求找错~
你的错误就在于没有充分认识到c语言的字符串是以\0为结束符的
你的移动了字符后,没有在新字符传的尾部加上\0,
导致的结果是输出的数据后面出现有重复的字符。
你的算法存在不足是你出现这个问题的主要原因
你应该这样处理:
循环处理s1的所有字符,如果该字符出现在s2中,那么就不再处理
如果没有出现在s2中,就将该字符保存在第三个字符串中,
最后将第三个字符串的数据尾部增加\0后拷贝到s1中
这个效率要比你的算法效率高,不易出错
下面是实例代码:
/**
* 将字符串s1中的出现在s2中的字符全部删除,并在s1中返回
* @param s1
* @param s2
* @return
*/...全部
你的错误就在于没有充分认识到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;
}。收起