深信服入职前编码训练21题--04

题目描述:

以下函数解析字符串str是否合法的C语言字符串字面值定义(不考虑八进制和十六进制字符编码),如果是,则将解码后的内容保存到buf中,并返回0,否则返回-1。比如,"hello \"sangfor\""解码后结果为hello "sangfor",请完成该函数代码:

int unescape_c_quoted(char *buf, const char *str){
    //TUDO
}

 

 

输入描述:

字符串

输出描述:

解码后的字符串
示例1
输入

"\"hello world\\n\\\"too\""

输出

"hello world\n\"too"

 

解析: 只需要按照要求识别出转义字符,然后将字面值的转义字符替换为对应的ASCII码。

注意合法的字符串字面值开始和结尾必须用双引号括起来。

 

解答:

 1 #include <stdio.h>
 2 #include <malloc.h>
 3 #include <string.h>
 4 #include <ctype.h>
 5 
 6 int isOK(char c){
 7     return (c=='\\' || c=='\"'||
 8             c=='\'' || c=='n' ||
 9             c=='t'  || c=='a' ||
10             c=='b'  || c=='f' ||
11             c=='r'  || c=='v');
12 }
13 
14 char to(char c){
15     if(c=='\\') return '\\';
16     if(c=='\'') return '\'';
17     if(c=='\"') return '\"';
18     if(c=='n')  return '\n';
19     if(c=='a')  return '\a';
20     if(c=='b')  return '\b';
21     if(c=='f')  return '\f';
22     if(c=='r')  return '\r';
23     if(c=='t')  return '\t';
24     if(c=='v')  return '\v';
25     return 0;
26 }
27 
28 int unescape_c_quoted(char *buf, const char *str)
29 {
30     //TODO:
31     char *pbuf = buf;
32     const char *pstr = str+1;
33     while(*pstr!='\0'){
34         *pbuf = *pstr;
35         if(*pstr=='\\' && *(pstr+1)!='\0' && isOK(*(pstr+1))){
36             *pbuf = to(*(pstr+1));
37             ++pstr;
38         }
39         ++pbuf;
40         ++pstr;
41     }
42     *(pbuf-1)='\0';
43     return 0;
44 }
45 
46 int main()
47 {
48     char str[10000];
49     char buf[10000];
50     int len;
51 
52     if (fgets(str, sizeof(str), stdin) == NULL) {
53         fprintf(stderr, "input error\n");
54         return 0;
55     }
56     len = strlen(str);
57     while (len > 0 && isspace(str[len - 1])) {
58         str[len - 1] = '\0';
59         --len;
60     }
61     if(*str!='\"' || *(str+len-1)!='\"'){
62         printf("error\n");
63         return 0;
64     }
65     unescape_c_quoted(buf, str);
66     printf("%s\n", buf);
67     
68     fprintf(stderr, "input:%s\noutput:%s\n", str, buf);
69     return 0;
70 }

 

posted @ 2020-05-15 21:11  T丶jl  阅读(684)  评论(0编辑  收藏  举报