一面的時候,面試官叫在紙上寫這個函數,用紙寫真心疼,原理其實很簡單的。
例如:%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,技術交流為主。