如何从C中的字符串中删除所有出现的给定字符?

时间:2012-03-27 18:17:03

标签: c string

我正在尝试从C中的字符串中删除一个字符。我的代码问题是它从字符串中删除了字符的第一个实例,但也擦除了字符串中该字符后的所有内容。例如,从'hello'中删除'l'会打印'he'而不是'heo'

int i;
char str1[30] = "Hello", *ptr1, c = 'l';
ptr1 = str1;
for (i=0; i<strlen(str1); i++)
{
    if (*ptr1 == c) *ptr1 = 0;
    printf("%c\n", *ptr1);
    ptr1++;
}

我需要使用指针,并希望尽可能简单,因为我是C的初学者。 感谢

7 个答案:

答案 0 :(得分:24)

你可以这样做:

void remove_all_chars(char* str, char c) {
    char *pr = str, *pw = str;
    while (*pr) {
        *pw = *pr++;
        pw += (*pw != c);
    }
    *pw = '\0';
}

int main() {
    char str[] = "llHello, world!ll";
    remove_all_chars(str, 'l');
    printf("'%s'\n", str);
    return 0;
}

这个想法是保持一个单独的读写指针(pr用于读取,pw用于写入),总是提前读取指针,并且只有当它没有指向一个指针时才推进写入指针给定的角色。

答案 1 :(得分:4)

如果你删除了那些字符,那么每次删除一个字符时,你必须将字符串的其余部分移到左边一个位置,这不是很有效。最好的方法是使用第二个数组来获取过滤后的字符串。例如,您可以像这样更改代码。

int i;
char str1[30] = "Hello", *ptr1, c = 'l';
char str2[30] = {0}, *ptr2;
ptr1 = str1;
ptr2 = str2;
for (i=0; i<strlen(str1); i++)
{
    if (*ptr1 != c) *ptr2++=*ptr1;
    ptr1++;
}
printf("%s\n", str2);

答案 2 :(得分:2)

char str1[30] = "Hello", *prt1, c = 'l';
char str2[30], *prt2;
prt1 = str1;
prt2 = str2;
while(*prt1 != 0)
{
    if(*prt1 != c)
    {
         *prt2 = *prt1;
         prt2++;  
    }
    prt1++;
}
*prt2 = '\0';

答案 3 :(得分:1)

问题是当你遇到匹配c的第一个字符时,你会在那里插入一个空字符。这意味着你基本上切断了其余的字符串。

您需要做的是找到匹配的字符,将后面的字符移回一个位置。然后,您需要在最后插入空字符,具体取决于您删除的字符数。

答案 4 :(得分:1)

我知道这是一种重复的答案,但这段代码是用于解决问题的函数版本。我认为,由于提问者是初学者,他可能会从分解版本的问题中学到很多东西。

int del_x_char(char *p, int x)
{
    char *q;
    x=first_occurance(p, 'i')/*you can replace any character that you want delete with 'i'*/
    q=p+x;
    while(*q=*(q+1))
        q++;
    *q='\0';
    return 0;
}
int first_occurance(char *q, char phar)
{
    int i=0;
    while(*q)
    {   
        if(*q++==phar)
            return i;
        i++;
    }
    return -1;
}

答案 5 :(得分:0)

只需更改

if (*ptr1 == c) *ptr1 = 0;

if (*ptr1 == c) continue;

正如@ouah所说,它在第一个NULL字符处断开..

答案 6 :(得分:-1)

C将字符串定义为“由第一个空字符