一面的时候,面试官叫在纸上写这个函数,用纸写真心疼,原理其实很简单的。
例如:%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;//字符串的末尾加上
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 : %srn", s);
74 char *d = urldecode(s);
75 if(d){
76 printf("decode is: %s rn", d);
77 free(d);
78 }
79 printf("now s is : %s",s);
80 return 0;
81 }
当然真正的url解码的函数不只是解析这个%xx的,我只是简单的写一个解析%xx的函数而已。
我是HuangJacky,技术交流为主。
原文链接: https://www.cnblogs.com/huangjacky/archive/2012/04/24/2467750.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/48388
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!