Подтвердить что ты не робот

Как удалить все вхождения данного символа из строки в C?

Я пытаюсь удалить символ из строки в C. Проблема, с которой я столкнулась с моим кодом, заключается в том, что он удаляет первый экземпляр символа из строки, а также стирает все после этого символа в строке. Например, удаление 'l' из 'hello' печатает '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. Благодаря

4b9b3361

Ответ 1

Вы можете сделать это следующим образом:

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 для записи), всегда продвигать указатель чтения и продвигать указатель записи только тогда, когда он не указывает на данный символ.

Ответ 2

Если вы удалите символы на месте, вам придется перемещать остальную часть строки на одно место слева каждый раз, когда вы удаляете символ, это не очень эффективно. Лучше всего иметь второй массив, который принимает отфильтрованную строку. Например, вы можете изменить свой код следующим образом.

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

Ответ 3

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

Ответ 4

Проблема заключается в том, что когда вы сталкиваетесь с первым символом, который соответствует c, вы вставляете туда нулевой символ. Это означает, что вы по существу отсекаете остальную часть строки.

Что вам нужно сделать, когда вы найдете подходящий символ, переместите следующие символы назад на одну позицию. Затем вам нужно вставить нулевой символ в самом конце, в зависимости от того, сколько символов вы удалили.

Ответ 5

Я знаю, что это тип дублированного ответа, но этот код является функциональной версией для решения проблемы. Я думал, что, поскольку вопрошающий был новичком, он мог бы многому научиться из разложенной версии проблемы.

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

Ответ 6

просто измените

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

к

if (*ptr1 == c) continue;

как сказал @ouah, он разбивается на первый символ NULL.

Ответ 7

C определяет строку как "непрерывную последовательность символов, завершаемую и включающую первый символ null"