Удаление символов из строки на языке C
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); 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