Преобразуйте управляющие последовательности в правильные символы - PullRequest
0 голосов
/ 25 мая 2018

Я собираюсь написать программу на C, которая переписывает строку t в переменные s и преобразует символы, такие как новая строка, табуляция, в управляющие последовательности, такие как \ n, \ t.Затем мне нужно написать функцию, которая выполняет обратную операцию - преобразует управляющие последовательности в правильные символы.

Вот мой код:

#include <stdio.h>
#define LIMIT 50

void escape(char * s, const char * t);
void bumpInto(char * s, const char * t);

int main(void) {
    const char s1[LIMIT] = "Ala\nma\tkota.";
    char s2[LIMIT];
    char s3[LIMIT];
    printf("%s\n", s1);
    escape(s2, s1);
    printf("%s\n", s2);
    bumpInto(s3, s2);
    printf("%s\n", s3);
    return 0;
}

void escape(char * s, const char * t) {
    while (*t) {
        switch (*t) {
        case '\n':
            *s = '\\';
            ++s;
            *s = 'n';
            break;
        case '\t':
            *s = '\\';
            ++s;
            *s = 't';
            break;
        default:
            *s = *t;
            break;
        }
        ++s;
        ++t;
    }
}

void bumpInto(char * s, const char * t) {
    char prev = 0;
    while (*t) {
        if (prev == '\\') {
            switch (*t) {
            case 'n':
                --s;
                *s = '\n';
                break;
            case 't':
                --s;
                *s = '\t';
                break;
            }
        }
//        if (prev != '\\' && *t != '\\')
            *s = *t;
        putchar(*s);
        prev = *t;
        ++s;
        ++t;
    }
}

У меня есть результаты:

Alanmatkota.@

вместо ожидаемого:

Ala
ma       kota.

У меня проблема с записью функции bumpInto, которая выполняет обратную операцию, а не escape, в частности, преобразовывает управляющие последовательности в правильные символы.Может кто-нибудь сделать предложения, как это сделать?

1 Ответ

0 голосов
/ 25 мая 2018

Вы переписываете свои управляющие символы:

 *s = *t; 

выполняется каждый раз.Просто добавьте еще:

void bumpInto(char * s, const char * t) {
    char prev = 0;
    while (*t) {
        if (prev == '\\') {
            switch (*t) {
            case 'n':
                --s;
                *s = '\n';
                break;
            case 't':
                --s;
                *s = '\t';
                break;
            }
        }else
            *s = *t;
        putchar(*s);
        prev = *t;
        ++s;
        ++t;
    }
 *s = *t; // add null terminator '/0'
}

Кстати, вы не справились с нулевым ограничителем строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...