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

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

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

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

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

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

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

#include <stdio.h>
#define MAX 100
 
void squeeze (char s[], int c);
 
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';
}

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

#include <stdio.h>
#define MAX 100
#define DEL 10
 
void squeeze (char s[], char s1[]);
void written (char s[]);
 
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';
  }
}

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

Решение задач на языке C