一面的时候,面试官叫在纸上写这个函数,用纸写真心疼,原理其实很简单的。
例如:%20其实就是对应的ascii 32的字符(空格)吧。面试的时候我只写了一半出来,太耗时了,现在回来用电脑写了下。这种解析字符串的函数,我们都可以画一个状态转换的图,就是编译原理里面的那个图。由于这个函数比较简单,我就只画一个流程图就可以了。图是在ubuntu下用libreOffice套件中的draw画的,真心疼,太不方便了。用Dia也不方便。还是visio好。
流程图有了,接下来就是函数代码段了。1 /* 2 * main.c 3 * 4 * Created on: 2012-4-23 5 * Author: huangjacky 6 */ 7 8 #include9 #include 10 #include 11 12 #define null NULL;13 14 int hexchar2int(char);15 16 /**17 * 对src进行url解码18 *param src char* urlencode后的字符串形式19 *return null: 字符串src的形式不对,否则 解析成功后的字符串20 */21 char* urldecode(char *src){22 int len = strlen(src);23 if (len % 3) //位数不对24 return NULL;25 int count = len / 3;26 char *dst = (char *)malloc(sizeof(char) * (count+1));27 if (! dst ) // 分配空间失败28 return null;29 //节约空间,直接用变量len和count来充当临时变量30 int flag = 1;31 char *dst1 = dst;32 while(*src){ //字符串没有结束33 if ( *src == '%'){ //进入解析状态34 src++;35 len = hexchar2int(*src);36 src++;37 count = hexchar2int(*src);38 if (count == -1 || len == -1){ //判断字符转换成的整数是否有效39 flag = 0;40 break;41 }42 *dst1++ =(char)( (len << 4) + count);//存储到目的字符串43 }else{44 flag = 0;45 break;46 }47 src++;48 }49 if (!flag){ //如果解析过程中出现了错误50 free(dst);51 return null;52 }53 *dst1 = 0;//字符串的末尾加上\054 return dst;55 }56 /**57 *将hex字符转换成对应的整数58 *return 0~15:转换成功,-1:表示c 不是 hexchar59 */60 int hexchar2int(char c){61 if (c >= '0' && c <= '9')62 return c - '0';63 else if (c >= 'a' && c <= 'f')64 return c - 'a' + 10;65 else if (c >= 'A' && c <= 'F')66 return c - 'A' + 10;67 else68 return -1;69 }70 71 int main(){72 char *s = "%48%4d";73 printf("s is : %s\r\n", s);74 char *d = urldecode(s);75 if(d){76 printf("decode is: %s \r\n", d);77 free(d);78 }79 printf("now s is : %s",s);80 return 0;81 }
当然真正的url解码的函数不只是解析这个%xx的,我只是简单的写一个解析%xx的函数而已。
我是HuangJacky,技术交流为主。