Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将控制序列转换为正确的字符_C_String_Char - Fatal编程技术网

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

C 将控制序列转换为正确的字符,c,string,char,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

我将用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;
    }
}
而不是预期的:

Ala
ma       kota.

我在编写bumpInto函数时遇到了问题,该函数执行与转义相反的操作,特别是将控制序列转换为正确的字符。有人能提出建议吗?

您正在重写控制字符:

 *s = *t; 
每次都被执行。只需添加一个else:

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'
}

顺便说一句,您没有处理字符串的空终止符。

您只需要做一件事:分支或相反。您现在所做的操作将覆盖开关的结果。此外,还有一种比保持
prev
@Arkadiy更优雅的方法,我应该具体做什么?当你看到一个“`”,你应该做一件事。当你看到另一个角色时,你应该做另一件事。萨皮恩蒂。
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'
}