首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K&R图书3-2练习(逃逸功能)

K&R图书3-2练习(逃逸功能)
EN

Stack Overflow用户
提问于 2016-11-16 18:46:25
回答 1查看 72关注 0票数 0

编写一个函数转义( s,t),在将字符串t复制到s时,将换行符和制表符等字符转换为可见的转义序列,例如\n和\t。使用开关。也为另一个方向编写一个函数,将转义序列转换为真实字符。

这是K&R书中的练习3-2 .所以我试着去做。我的逃逸功能正常工作。但是我的反向逃逸给我的答案和逸出函数给出的答案一样。以下是代码:

代码语言:javascript
复制
#include <stdio.h>
#define MCC 100

void espace(int* str,int* t);
void inverseescape(int * str,int *t);
void getline(int*);

int main(void){
    int firstarr[MCC];
    int secondarr[MCC];
    int thirdarr[MCC];
    getline(firstarr);
    espace(firstarr,secondarr);
    printf("-----------AFTER ESCAPE------------\n");
    for(int g=0;secondarr[g];g++){
        printf("%c",secondarr[g]);
    }
    inverseescape(secondarr,thirdarr);
    printf("\n-----------AFTER INVERSEESCAPE------------\n");
    for(int g=0;thirdarr[g];g++){
        printf("%c",thirdarr[g]);
    }
    return 0;
}

void getline(int* arr){
    int i=0;
    int c=0;
    while((c=getchar())!=EOF){
        arr[i]=c;
        arr[i+1]=0;
        i++;
    }
}

void espace(int* string,int* target){
    int i = 0;
    int j = 0;
    while(string[i]){
        switch(string[i]){
            case '\a':
                target[j]='\\';
                target[++j]='a';
                target[++j]=0;
                break;
            case '\b':
                target[j]='\\';
                target[++j]='b';
                target[++j]=0;
                break;
            case '\t':
                target[j]='\\';
                target[++j]='t';
                target[++j]=0;
                break;
            case '\n':
                target[j]='\\';
                target[++j]='n';
                target[++j]=0;
                break;
            case '\v':
                target[j]='\\';
                target[++j]='v';
                target[++j]=0;
                break;
            case '\f':
                target[j]='\\';
                target[++j]='f';
                target[++j]=0;
                break;
            case '\r':
                target[j]='\\';
                target[++j]='r';
                target[++j]=0;
                break;
            case '\"':
                target[j]='\\';
                target[++j]='\"';
                target[++j]=0;
                break;
            case '\'':
                target[j]='\\';
                target[++j]='\'';
                target[++j]=0;
                break;
            case '\?':
                target[j]='\\';
                target[++j]='\?';
                target[++j]=0;
                break;
            case '\\':
                target[j]='\\';
                target[++j]='\\';
                target[++j]=0;
                break;
            default:
                target[j]=string[i];
                target[++j]=0;
                break;
        }
        i++;
    }
}

void inverseescape(int* string,int* target){
    int i = 0;
    while(string[i]){
        switch(string[i]){
            case '\\':
            switch(string[i+1]){
                case 'a':
                target[i]='\a';
                case 'b':
                target[i]='\b';
                case 't':
                target[i]='\t';
                case 'n':
                target[i]='\n';
                case 'v':
                target[i]='\v';
                case 'f':
                target[i]='\f';
                case 'r':
                target[i]='\r';
                case '\"':
                target[i]='\"';
                case '\'':
                target[i]='\'';
                case '\?':
                target[i]='\?';
                case '\\':
                target[i]='\\';
            }
            default:
            target[i]=string[i];
        }
        target[++i]=0;
    }
}

我第一次(也可能是最后一次)使用开关语句,所以代码写得不好(我猜)。

输入:

阴影 的 这个 兽兽

输出:

影子\n野兽\n 影子\n野兽\n

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-16 18:59:59

break case语句中缺少了inverseescapecase的行为有一种奇怪的特性:除非你明确地将breakcase中移出,否则它就会掉进下面的语句。在这种情况下,它会掉进你的default情况,并将输出设置为输入。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40639923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档