C語言寫的ipv6自動補全演算法食之無味棄之可惜
這是一個ipv6自動補全的一個演算法,空間複雜度有點高
int complete_ipv6(char* ipv6, char* complete_v6)
{
char ipcom[40] = {"0000:0000:0000:0000:0000:0000:0000:0000"};
char *tmpcomv6[128] = { 0 };
char *p = NULL, *q = NULL, *q1 = NULL;
int cnt = 0, i = 0, len = 0, l1 = 0, l2 = 0, l3 = 0, sum = 0, l1tmp = 0;
// 將IPv6地址用::分開
// 如果IPv6地址為::
// 如果不包含::或以::結尾
// 如果以::開頭或::在中間
p = strchr(ipv6, '/');
if (p != NULL) {
*p = '\0';
}
p = strstr(ipv6, "::");
len = strlen(ipcom);
if (p != NULL) {
if (p == ipv6) {
// 地址以::開頭
if (*(p + 2) == '\0') {
// 地址為::
memcpy(complete_v6, ipcom, 40);
} else {
// 地址為::xxx
sum = 0;
q1 = NULL;
q = p + 2;
l1 = strlen(q);
for (i = 0; i < l1; i++) {
if (*(p + 1 + l1 -i) != ':') {
q1 = strrchr(q, ':');
*(ipcom + len - i -1 - sum) = *(p + 1 + l1 -i);
} else {
l1tmp = strlen(q);
sum += (4 - (l1tmp - (q1 - q) -1));
*q1 = '\0';
cnt += 1;
}
}
}
}
// 地址形式xxx::xxx
if (p != ipv6) {
// 處理xxx::
cnt = 0;
q = ipv6;
l3 = p - ipv6;
for (i = 0; i < l3; i++) {
if (*(ipv6 + i) != ':') {
q1 = strchr(q, ':');
*(ipcom + (4 - (q1 - q)) + sum + i) = *(ipv6 + i);
} else {
sum += (4 - (q1 - q));
q1 = q1 + 1;
q = q1;
cnt += 1;
}
}
// 處理::xxx
sum = 0;
q1 = NULL;
q = p + 2;
l1 = strlen(q);
l1tmp = 0;
for (i = 0; i < l1; i++) {
if (*(p + 1 + l1 -i) != ':') {
q1 = strrchr(q, ':');
*(ipcom + len - i -1 - sum) = *(p + 1 + l1 -i);
} else {
l1tmp = strlen(q);
sum += (4 - (l1tmp - (q1 - q) -1));
*q1 = '\0';
cnt += 1;
}
}
} else {
}
} else {
// 不包含::
l2 = strlen(ipv6);
sum = 0;
q1 = NULL;
q = ipv6;
for (i = 0; i < l2; i++) {
if (*(ipv6 + i) != ':') {
q1 = strchr(q, ':');
if (q1 == NULL) {
q1 = strchr(q, '\0');
}
*(ipcom + (4 - (q1 - q)) + sum + i) = *(ipv6 + i);
} else {
sum += (4 - (q1 - q));
q1 = q1 + 1;
q = q1;
cnt += 1;
}
}
}
memcpy(complete_v6, ipcom, 40);
printf("------%s\n", complete_v6);
return 0;
}
有需要的同學可以測試一下這個,我測過是可以滿足我寫這段程式碼時的所需邏輯。
如果你有所改進,請分享出來
相關文章
- python之 自動補全 tabPython
- C語言演算法之猴子吃桃C語言演算法
- 使用C語言編寫貪食蛇程式原始碼C語言原始碼
- kubectl的自動補全
- 手機寫作業系統之 使用C語言編寫核心作業系統C語言
- C語言演算法之17:細胞生命遊戲C語言演算法遊戲
- 語言演算法之:階乘演算法
- 細學C++之C++語言的特點C++
- mac git 自動補全MacGit
- pycharm 如何自動補全PyCharm
- 完善 VSCode 的 Node 自動補全VSCode
- Docker 命令自動補全?要的Docker
- vscode怎麼設定html標籤自動補全? vscode自動補全html的技巧VSCodeHTML
- C 語言程式設計利器之 CLion程式設計
- C語言訓練之杭電OJC語言
- C++語言演算法之求任意兩個相同字元的最大距離C++演算法字元
- Docker自動補全容器名Docker
- [譯] 自動補全規則
- 終端自動補全命令
- 自己用C語言寫的一個模擬退火演算法C語言演算法
- 孫海洋老師C語言零基礎自學入門 ----排序演算法 之 "氣泡排序"C語言排序演算法
- C++2.0——語言新特性之Variadic TemplatesC++
- C語言學習之求各因子之和C語言
- C語言學習之:指標與字串C語言指標字串
- C語言學習筆記之變數C語言筆記變數
- C語言-字串函式的實現(五)之strstrC語言字串函式
- C語言-字串函式的實現(一)之strlenC語言字串函式
- 補充:C語言列舉型別C語言型別
- Perceptron演算法—C語言演算法C語言
- 食材的性味與歸經
- 備份Outlook 2016 的自動補全列表
- Python如何設定自動補全?Python
- Laravel artisan bash 命令自動補全Laravel
- CSS 也能自動補全字串?CSS字串
- fish shell 自動補全子命令
- C語言-檔案讀寫C語言
- Android熱補丁之Robust(二)自動化補丁原理解析Android
- C語言學習筆記之指標的運算C語言筆記指標