zoukankan      html  css  js  c++  java
  • 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,技术交流为主。

  • 相关阅读:
    减轻Temporal AA 的 拖影问题(ghosting)
    UE4开发PSVR游戏流程
    3.1 使用STC89C52控制MC20拨打电话
    2.6 基于ARDUINO UNO+MC20的路径显示功能
    2.5 使用ARDUINO做主控,手机发送短信控制开关LED
    2.4 使用ARDUINO控制MC20进行GPS数据的获取和解析
    2.3 使用ARDUINO控制MC20进行GPRS的TCP通讯
    2.2 使用ARDUINO控制MC20发短信
    2.1 使用ARDUINO控制MC20打电话
    1.8 使用电脑测试MC20的GPRS功能
  • 原文地址:https://www.cnblogs.com/huangjacky/p/2467750.html
Copyright © 2011-2022 走看看