首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言字串陣列遍歷與比較:封包類型辨識實作

     編輯:關於C語言

字串陣列遍歷比較實戰:預設封包類型辨識

在網路設備軟體開發中,常需將接收封包的訊息類型與預定義類型表比對。本文展示如何透過字串陣列遍歷與大小寫不敏感比較實現此功能。

預設封包類型定義

static char *_default_packet_types[] = {
    "ddos client quota", "ddos server quota",
    "blocked ports", "blocked sites",
    "ip scan", "port scan",
    "ip source route", "icmp flooding",
    "ike flooding", "ipsec flooding",
    "ip spoofing sites", "syn flooding",
    "udp flooding", "tcp syn checking failed",
    NULL // 陣列結束標記
};

比對函數實作

boolean pr_get_default_packet_flag_from_msg(PacketFilterMessageTable *packetTable, char **packetType) {
    char *p_msg = NULL;
    wgpr_boolean flag = FALSE;
    char **type_ptr = NULL;

    // 參數檢查
    if (!packetTable) return flag;
    if (packetTable->_tag_id != FWDENY_TAG ||
        packetTable->_msg == NULL ||
        packetTable->_msg[0] == '\0')
        return flag;

    p_msg = packetTable->_msg;

    // 遍歷字串陣列進行比對
    for (type_ptr = _default_packet_types; *type_ptr != NULL; type_ptr++) {
        // strncasecmp: 大小寫不敏感比較,長度為目標字串長度
        if (!strncasecmp(p_msg, *type_ptr, strlen(*type_ptr))) {
            flag = TRUE;
            break;
        }
    }
    *packetType = flag == TRUE ? DEFAULTPACKET : DENIEDPACKET;
    return flag;
}

關鍵技術點解析

  • 字串陣列遍歷:使用指標 char **type_ptr 走訪,以 NULL 為終止條件
  • 大小寫不敏感比較:strncasecmp 避免大小寫差異導致誤判
  • 比較長度控制:使用 strlen(*type_ptr) 確保完整匹配,避免部分匹配誤判
  • 防禦性程式設計:多層參數檢查確保健壯性

呼叫範例

if (pr_get_default_packet_flag_from_msg(pk_t, &packetType)) {
    is_dflt_packet = TRUE;
}

常見陷阱與改進建議

原始碼中 sizeof(*type_ptr) - 1 錯誤計算字串長度(實為指標大小),應改用 strlen(*type_ptr)。此外,若效能敏感可考慮雜湊表或 Trie 樹優化查找速度。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved