在玩九宮棋時,靈感一現,想到」中心與圓「,便想到了用圓規畫圓的過程,圓規畫圓就像雷達掃描那樣麼!顯然,數據的匹配也能夠作到像雷達掃描那樣去發現並匹配目標(很差意思,改用繁體了^-^)。因此,乾脆就叫」雷達「算了!畢竟,要比常見的匹配算法快很多;測試還是Debug模式的靠譜點,現在發行版的優化真的從指令到邏輯都作到了極緻,都面目全非了。算法
static char * _cdecl al_radar_find(const char * lpText, size_t uTextLen, const char * lpContent, size_t uContentLen) { size_t uOdd = uContentLen % 2U; const size_t uZone = (uContentLen / 2U - 1U) + uOdd; const size_t uMove = (uZone + 2U) - uOdd; for (size_t i = uZone; i < uTextLen; i += uContentLen) { register size_t j = 0U; do { if (((char *)(lpText + i))[j] == lpContent[0]) { register size_t c = 1U; uOdd = i + j; do { if (((char *)(lpText + uOdd))[c] != lpContent[c]) { goto JMP_BYTE_NEXT; } } while ((++c) < uContentLen); return (char *)(lpText + uOdd); } if (((char *)(lpText + i))[j] == lpContent[uZone]) { register size_t c = 0U; uOdd = (i + j) - uZone; do { if (((char *)(lpText + uOdd))[c] != lpContent[c]) { goto JMP_BYTE_NEXT; } } while ((++c) < uContentLen); return (char *)(lpText + uOdd); } JMP_BYTE_NEXT: ++j; } while (j < uMove); } return NULL; }