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

WinCC 環境下 C 語言字串分割:strtok 安全使用指南

     編輯:關於C

應用場景

在 WinCC 腳本或 C 動作中,常需解析逗號分隔的 CSV 格式字串,例如 "地址,名稱,單位,類型"。標準庫 strtok 是首選工具,但其非執行緒安全、會修改原字串、需小心處理連續分隔符等特性必須充分理解。

strtok 核心機制

  • 第一次呼叫傳入字串指標,後續呼叫傳入 NULL 以繼續分割。
  • 函數內部維護靜態指標記錄下一個搜尋位置(故非執行緒安全)。
  • 遇到分隔符將其覆寫為 \0,返回 Token 起始位址。
  • 連續分隔符會被視為單一分隔符(不會產生空 Token)。

實戰程式碼:解析四欄位 CSV

#include 
#include 

// 假設輸入格式:Address,Name,Unit,Type
// 輸出參數:Add, Name, Unit(需呼叫端預先分配足夠緩衝區)
void ParseAddressAndUnit(char *str, char *Add, char *Name, char *Unit) {
    if (!str || !Add || !Name || !Unit) return;

    char *token = strtok(str, ",");  // 第一次分割
    if (token) {
        strncpy(Add, token, strlen(token));
        Add[strlen(token)] = '\0';  // 確保結尾
    }

    int field = 0;
    while ((token = strtok(NULL, ",")) != NULL) {
        field++;
        if (field == 1) {           // 第二欄:Name
            strncpy(Name, token, strlen(token));
            Name[strlen(token)] = '\0';
        } else if (field == 3) {    // 第四欄:Unit
            strncpy(Unit, token, strlen(token));
            Unit[strlen(token)] = '\0';
            break;                  // 取得目標欄位,提前結束
        }
    }
}

關鍵細節與避坑指南

問題後果解決方案
修改原字串若原字串為常值或需保留,會導致崩潰或資料遺失先 strcpy 到可寫緩衝區再分割
非執行緒安全多執行緒同時呼叫會互相干擾使用 strtok_r (POSIX) 或 strtok_s (C11 Annex K)
連續分隔符合併"a,,b" 只能取到 "a" 和 "b",中間空欄位丟失若需保留空欄位,改用 strsep 或手寫解析器
緩衝區溢位strncpy 不自動加 \0 當長度剛好等於來源手動加 dest[n-1] = '\0' 或改用 snprintf

執行緒安全版本:strtok_r

// POSIX 標準,需 _POSIX_C_SOURCE >= 1
void ParseThreadSafe(char *str, char *Add, char *Name, char *Unit) {
    char *saveptr = NULL;
    char *token = strtok_r(str, ",", &saveptr);
    // 後續呼叫傳入 NULL 與同一 saveptr
    while ((token = strtok_r(NULL, ",", &saveptr)) != NULL) {
        // ...
    }
}

WinCC 專屬注意事項

  • WinCC C 腳本運行於單執行緒環境,strtok 通常安全,但若在同時觸發的多個動作中使用,仍有風險。
  • 字串來源可能來自標籤讀取,長度不固定,務必檢查緩衝區大小。
  • 專案編碼可能為 ANSI/UTF-8/Unicode,確保分隔符字元編碼一致。

總結

strtok 輕量便利,適合簡單 CSV 解析。掌握其修改原字串、靜態狀態、連續分隔符合併三大特性,並配合 strtok_r/strtok_s 處理並發場景,即可在 WinCC 專案中穩健應用。複雜格式(含引號、跳脫字元)建議引入成熟 CSV 解析庫或手寫狀態機。

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