Удаление символов из строки
K&R (61-62). Приводится пример функции 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'; } }
Примечание. Во второй программе запись символов в строку выделена в отдельную функцию, т.к. надо записать две строки. Иначе пришлось бы дублировать код.