C – urldecode函数编写

一面的时候,面试官叫在纸上写这个函数,用纸写真心疼,原理其实很简单的。

例如:%20其实就是对应的ascii 32的字符(空格)吧。

面试的时候我只写了一半出来,太耗时了,现在回来用电脑写了下。

这种解析字符串的函数,我们都可以画一个状态转换的图,就是编译原理里面的那个图。

由于这个函数比较简单,我就只画一个流程图就可以了。

C - urldecode函数编写

图是在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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午12:13
下一篇 2023年2月9日 上午12:15

相关推荐