четверг, 13 ноября 2014 г.

Упражнение 2.4.

Напишите версию функции squeeze(s1, s2), которая удаляет из s1 все символы, встречающиеся в строке s2.
$ vim squeeze.c
#include <stdio.h>
#define MAXLINE 1000

int getstr(char line[], int maxline);
void squeeze(char s1[], char s2[]);

int main(void)
{
    char s1[MAXLINE];
    char s2[MAXLINE];
    int len;

    printf("Введите строку s1:\n");
    while ((len = getstr(s1, MAXLINE)) == 0)
        ;

    printf("Введите строку s2:\n");
    while ((len = getstr(s2, MAXLINE)) == 0)
        ;

    squeeze(s1, s2);
    printf("%s\n", s1);

    return 0;
}

int getstr(char s[], int lim)
{
    int c, i;

    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if (c == '\n')
        s[i++] = c;
    s[i] = '\0';        /* в конец строки дописывам "0" */
    return i;   /* функция возвращает длину строки */
}

void squeeze(char s1[], char s2[])
{
    int i, j, m;

    /* Перебор символов в массиве из которого выполняем поиск: s2 */
    for (i = 0; s2[i] != '\0'; i++)
    {
        /* Перебор символов в массиве в котором выполняем поиск: s1 */
        for (j = 0; s1[j] != '\0'; j++)
        {
            /* Сравнение символов */
            if (s1[j] == s2[i])
            {
                /* Если символ встречается, удаляем его смещением элементов массива s1
                 * на один влево.В переменной m запоминаем текущую позицию встретившегося символа*/
                for (m = j; s1[m] != '\0'; m++)
                    s1[m] = s1[m + 1]; /* m++ писать нельзя, побочный эффект */

                j--; /* уменьшение индекса на единицу для повторной проверки наличия символа в строке s1 */
            }
        }
    }
}
$ cc -g -O0 -Wall -o a.out squeeze.c
$ ./a.out
Введите строку s1:
helhelhelhhhhoooooads
Введите строку s2:
leh
oooooads

Комментариев нет:

Отправить комментарий