четверг, 4 декабря 2014 г.

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

Напишите функцию escape(s, t), которая при копировании текста из t в s преобразует такие символы, как новая строка и табуляция в "видимые последовательности символов" (вроде \n и \t). Используйте инструкцию switch. Напишите функцию, выполняющую обратное преобразование эскейп-последовательностей в настоящие символы.
$ vim escape.c
#include <stdio.h>
#define MAXLINE 1000    /* максимальный размер вводимой строки */

int getstr(char line[], int maxline);
void escape(char s[], char t[]);
void descape(char s[], char t[]);

int main(void)
{
    int len;
    char s[MAXLINE];
    char t[MAXLINE];

    /* Ввод для escape() */
    printf("Введите строку s[] для escape():\n");
    while ((len = getstr(s, MAXLINE)) == 0)
        ;

    printf("Введите строку t[] для escape():\n");
    while ((len = getstr(t, MAXLINE)) == 0)
        ;

    escape(s, t);

    printf("%s", s);

    /* Ввод для descape() */
    printf("Введите строку s[] для descape():\n");
    while ((len = getstr(s, MAXLINE)) == 0)
        ;

    printf("Введите строку t[] для descape():\n");
    while ((len = getstr(t, MAXLINE)) == 0)
        ;

    descape(s, t);

    printf("%s", s);

    return 0;
}

/* getline: читает строку в s, возвращает длину */
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 escape(char s[], char t[])
{
    int i, j;
    i = j = 0;

    /* Пока не закончится массив t[] */
    while (t[i] != '\0')
    {
        switch(t[i]) {
            case '\t':
                s[j++] = '\\';  /* опережение символа */
                s[j] = 't';
                break;
            case '\n':
                s[j++] = '\\';
                s[j] = 'n';
                break;
            default:
                s[j] = t[i];
                break;
        }
        i++;
        j++;
    }
    s[j] = t[i];        /* копирование последнего элемента - '\0' */
}

void descape(char s[], char t[])
{
    int i, j;
    i = j = 0;

    while (t[i] != '\0')
    {
        if (t[i] == '\\') /* ищем символ начала escape-последовательности */
        {
            /* Проверяем следущий символ */
            switch (t[++i])
            {
            case 't':
                s[j] = '\t';
                break;
            case 'n':
                s[j] = '\n';
                break;
            default:
                s[j] = t[i];
        break;
    }
}
else
    s[j] = t[i];

i++;
j++;
    }
    s[j] = t[i];

}

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

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