Удаление символов из строки на языке C

K&R (61-62). Приводится пример функции squeeze, которая удаляет все символы c из строки s.

Ниже представлен полный код программы с использованием этой функции. А также ответ к упражнению 2.4, где предлагается написать функцию, удаляющую из строки s1 все символы, встречающиеся в строке s2.

Алгоритм удаления символа из строки можно описать так:

  1. Пока не будет достигнут конец строки,
  2. если очередной символ строки не равен символу для удаления,
  3. записать очередной символ по месту индекса j, после этого последний увеличить на единицу.

Другими словами, алгоритм сводится к тому, что символ по индексу i затирается следующим символом, если он совпал с символом для удаления; т.к. запись идет по счетчику j, а он увеличивается лишь тогда, когда символы из строки и для удаления не совпадают.

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

Удаление всех символов c из строки

#include <stdio.h>
#define MAX 100

void squeeze(char s[], int c);

int main() {
    char str0[MAX];
    int i, c;

    for (i = 0; (c = getchar()) != '\n'; i++)
        str0[i] = c;
    str0[i] = '\0';

    c = getchar();

    squeeze(str0, c);

    printf("%s\n", str0);
}

void squeeze(char s[], int c) {
    int i, j;

    for (i = j = 0; s[i] != '\0'; i++)
        if (s[i] != c)
            s[j++] = s[i];
    s[j] = '\0';
}

Пример выполнения:

one two three four five six seven
e
on two thr four fiv six svn

Удаление всех символов, встречающихся в строке s2, из строки s1

Здесь запись символов в строку выделена в отдельную функцию, т.к. надо записать две строки. Иначе пришлось бы дублировать код.

#include <stdio.h>
#define MAX 100
#define DEL 10

void squeeze(char s[], char s1[]);
void written(char s[]);

int main() {
    char str[MAX];
    char str1[DEL];
    written(str);
    written(str1);
    squeeze(str, str1);
    printf("%s\n", str);
}

void written(char s[100]) {
    int i, c;
    i = 0;
    while ((c = getchar()) != '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
}

void squeeze(char s[], char s2[]) {
    int k, i, j;
    for (k = 0; s2[k] != '\0'; k++) {
        for (i = j = 0; s[i] != '\0'; i++)
            if (s[i] != s2[k])
                s[j++] = s[i];
        s[j] = '\0';
    }
}

Пример выполнения:

one, two! 34 three four E
E!,34
one two  three four