Напишите функцию 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];
}
Комментариев нет:
Отправить комментарий