一面的时候,面试官叫在纸上写这个函数,用纸写真心疼,原理其实很简单的。
例如:%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 #include <stdio.h> 9 #include <string.h> 10 #include <stdlib.h> 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;//字符串的末尾加上\0 54 return dst; 55 } 56 /** 57 *将hex字符转换成对应的整数 58 *return 0~15:转换成功,-1:表示c 不是 hexchar 59 */ 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 else 68 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,技术交流为主。