将控制序列转换为正确的字符

时间:2018-05-25 17:25:30

标签: c string char

我将在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函数的问题,该函数执行与转义相反的操作,特别是将控制序列转换为正确的字符。任何人都可以提出建议吗?

1 个答案:

答案 0 :(得分:1)

您正在重写您的控制字符:

 *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'
}
是的,你没有处理字符串的空终止符。