C – urldecode函數編寫

來源:互聯網
上載者:User

一面的時候,面試官叫在紙上寫這個函數,用紙寫真心疼,原理其實很簡單的。
例如:%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;//字串的末尾加上\054     return dst;55 }56 /**57  *將hex字元轉換成對應的整數58  *return 0~15:轉換成功,-1:表示c 不是 hexchar59  */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     else68         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,技術交流為主。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.