繁体   English   中英

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

[英]How to remove all occurrences of a given character from string in C?

我正在尝试从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语言的初学者,因此希望使其尽可能简单。

您可以这样做:

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用于写入),始终提前读取指针,并且仅在未指向给定字符时才提前写入指针。

如果在适当位置删除字符,则每次删除字符时都必须将字符串的其余部分向左移动一个位置,这不是很有效。 最好的方法是让第二个数组接受已过滤的字符串。 例如,您可以像这样更改代码。

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);
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';

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

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;
}

问题是,当您遇到与c匹配的第一个字符时,您会在此插入一个空字符。 这意味着您实际上要切断字符串的其余部分。

您需要做的是找到匹配的字符时,将以下字符移回一个位置。 然后,您需要根据删除的字符数在最后插入空字符。

只是改变

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

if (*ptr1 == c) continue;

如@ouah所说,它在第一个NULL字符处中断。

C将字符串定义为“由第一个空字符终止并包括第一个空字符的连续字符序列”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM