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
您在'inverseescape'語句中缺少'break's。 – Muzer
函數:'getline()'是一個衆所周知的系統函數,暴露在stdio.h頭文件中。它的語法如下:'ssize_t getline(char ** lineptr,size_t * n,FILE * stream);'強烈建議爲您的函數使用唯一的名稱。 – user3629249
@Muzer我很笨...第一次使用開關....感謝您的幫助。 –