2016-11-16 106 views
0

寫函數escape(S,T),該像換行符和 標籤轉換成如\ n和\噸,因爲它複製 串T可見光轉義序列秒。使用開關。另外編寫一個函數 ,將轉義序列轉換爲真正的字符。K&R簿3-2練習(escape函數)

這是練習3-2從K & R書。所以我試圖去做。我的逃生功能正常工作。但是我的反轉效果給了我和逃逸函數一樣的答案。這裏是代碼:

#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; 
    } 
} 

我第一次使用switch語句(也許是最後一次),所以代碼沒有寫得很好(我猜)。

輸入:

陰影

輸出:

----------- AFTER ESCAPE ------------

陰影\ NOF \ n該\ nbeast

------- ---- AFTER INVERSEESCAPE ------------

陰影\ NOF \ n此\ nbeast

+3

您在'inverseescape'語句中缺少'break's。 – Muzer

+0

函數:'getline()'是一個衆所周知的系統函數,暴露在stdio.h頭文件中。它的語法如下:'ssize_t getline(char ** lineptr,size_t * n,FILE * stream);'強烈建議爲您的函數使用唯一的名稱。 – user3629249

+0

@Muzer我很笨...第一次使用開關....感謝您的幫助。 –

回答

2

你缺少breakinverseescape case語句。 case的行爲具有的好奇屬性,通過下降到下面的語句,除非您明確case中的break。在這種情況下,它會落入您的default情況並將輸出設置爲輸入。