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
- 關於mysql語句的自動補全MySql
- C語言演算法之猴子吃桃C語言演算法
- jquery 自動補全jQuery
- Mac終端自動補全忽略大小寫Mac
- C語言演算法之17:細胞生命遊戲C語言演算法遊戲
- Python的自動補全Python
- pycharm 如何自動補全PyCharm
- mac git 自動補全MacGit
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- Docker 命令自動補全?要的Docker
- 語言演算法之:階乘演算法
- [譯] 自動補全規則
- 終端自動補全命令
- Docker自動補全容器名Docker
- 細學C++之C++語言的特點C++
- Laravel artisan bash 命令自動補全Laravel
- fish shell 自動補全子命令
- CSS 也能自動補全字串?CSS字串
- vim自動補全外掛配置
- 完善 VSCode 的 Node 自動補全VSCode
- iOS自動佈局(Autolayout)之VFL(視覺化格式語言)iOS視覺化
- C 語言程式設計利器之 CLion程式設計
- C語言訓練之杭電OJC語言
- windows microsoft之c#語言規範WindowsROSC#
- C語言的本質(38)——makefile之變數C語言變數
- C語言“字串-數字”之間的轉換C語言字串
- 群體演算法之細菌覓食演算法演算法
- C語言_資料結構和演算法之_排序和查詢C語言資料結構演算法排序
- vscode怎麼設定html標籤自動補全? vscode自動補全html的技巧VSCodeHTML
- C++語言演算法之求任意兩個相同字元的最大距離C++演算法字元
- Linux設定python自動tab自動補全LinuxPython
- H3C交換機IPv6無狀態地址自動配置
- MySQL資料庫自動補全命令MySql資料庫
- Python如何設定自動補全?Python
- vim自動補全外掛-NeoComplCache
- phpmyadmin主機名自動補全PHP
- 自己用C語言寫的一個模擬退火演算法C語言演算法