例如,给定字符串str1 = "120jdvj00ncdnv000ndnv0nvd0nvd0"
和字符ch = '0'
,输出应该是12jdvj00ncdnv000ndnvnvdnvd
。也就是说,0
只在单独出现的地方被移除。这段代码不能运行
#include<stdio.h>
char remove1(char *,char);
int main()
{
char str[100]="1o00trsg50nf0bx0n0nso0000";
char ch='0';
remove1(str,ch);
printf("%s",str);
return 0;
}
char remove1(char* str,char ch)
{
int j,i;
for(i=0,j=0;i<=strlen(str)-1;i++)
{
if(str[i]!=ch)
{
if(str[i+1]==ch)
continue;
else
str[j++]=str[i];
}
}
str[j]=' ';
}
您的代码查找要删除的字符以外的其他内容,如果下一个字符是要删除的字符,则跳过(即不保留它刚刚看到的字符),否则它复制当前字符。因此,如果它看到'a0'并且正在寻找'0',它将忽略'a'。
您可以做的是复制除感兴趣的字符以外的所有字符,并在每次看到其中一个字符时将计数器设置为0(表示此时您看到的感兴趣的连续字符的数量)。当你找到一个感兴趣的增量计数。现在,每当您发现一个不感兴趣的字符时,如果计数为1(因为这是您想要删除的单个字符),则不做任何操作,或者将感兴趣的字符的多个实例放入str中,如果count> 1。
确保您处理了字符串以要删除的字符的连续运行结束的情况,并且您应该没有问题。
char *remove1(char* str, char ch){
char *d, *s;
for(d = s = str;*s;++s){
if(*s == ch){
if(s[1] == ch)
while(*s == ch)
*d++=*s++;
else
++s;//skip a ch
if(!*s)break;
}
*d++ = *s;
}
*d = ' ';
return str;
}
复制基本
的代码for(d = s = str;*s;++s){
*d++ = *s;
}
*d = ' ';
需添加特殊处理
for(d = s = str;*s;++s){
if(find a character that is specified){
Copy that in the case of continuously than one character
if one letter then skip
}
*d++ = *s;
}
*d = ' ';
下面是工作代码 输出为:" 1000trsg5nfbxnnso0000 "
#include<stdio.h>
char remove1(char *,char);
int main()
{
char str[100]="1o00trsg50nf0bx0n0nso0000";
char ch='0';
remove1(str,ch);
printf("%s",str);
return 0;
}
char remove1(char* str,char ch)
{
int j,i;
int len = strlen(str);
for(i = 0;i < (len - 1);i++){
if(str[i] == ch){
/* if either of check prev and next character is same then contd. without removal */
if((str[i+1] == ch) || (str[i-1] == ch))
continue;
/* replacing the char and shifting next chars left*/
for(j = i;j < (len - 2);j++) {
str[j] = str[j + 1];
}
/* string length is decrementing due to removal of one char*/
len--;
}
}
str[len] = ' ';
}