C - urldecode函数编写

一面的时候,面试官叫在纸上写这个函数,用纸写真心疼,原理其实很简单的。
例如:%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,技术交流为主。

posted @ 2012-04-24 11:38  HuangJacky  阅读(2952)  评论(0编辑  收藏  举报
AdminLogin