K&R (61-62). Удаление символов из строки

Решение задач на языке программирования C

Приводится пример функции squeeze, которая удаляет все символы c из строки s.

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

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

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

Другими словами, алгоритм сводится к тому, что символ по индексу 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';
	}
}

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