首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++中使用指針數組與strtok分割字符串提取子串

     編輯:程式設計綜合問答

C++中提取字符串子串的常見方法包括使用std::string的substr、find等成員函數,也可以利用C風格的指針數組配合strtok函數實現。本文演示如何使用指針數組從字符串中提取子字符串。

strtok函數介紹

strtok用於將字符串按指定分隔符分割為多個token(標記)。函數原型:

char *strtok(char *str, const char *delim);
  • 首次調用傳入目標字符串,後續調用傳入NULL
  • 分隔符字符串delim中任意字符均可作為分隔符
  • 返回下一個token的指針,無剩餘token時返回NULL
  • 注意:會修改原字符串,將分隔符替換為'\0'

指針數組存儲子串

由於strtok返回字符指針,可用指針數組char *tokens[MAX]保存每個子串的起始地址。

完整示例代碼

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[] = "- This, a sample string.";
    char *pch;
    char *tokens[20];  // 指針數組存儲子串指針
    int count = 0;

    printf("Splitting string \"%s\" into tokens:\n", str);
    
    pch = strtok(str, " ,.-");
    while (pch != NULL && count < 20) {
        tokens[count++] = pch;  // 保存子串指針
        printf("%s\n", pch);
        pch = strtok(NULL, " ,.-");
    }
    
    printf("\nTokens stored in pointer array:\n");
    for (int i = 0; i < count; i++) {
        printf("tokens[%d] = %s\n", i, tokens[i]);
    }
    
    printf("at the end: %s\n", str);  // 原字符串已被修改
    return 0;
}

運行結果

Splitting string "- This, a sample string." into tokens:
This
a
sample
string

Tokens stored in pointer array:
tokens[0] = This
tokens[1] = a
tokens[2] = sample
tokens[3] = string

at the end: - This, a sample string.

現代C++替代方案

推薦使用C++標準庫,更安全且功能豐富:

#include <string>
#include <vector>
#include <sstream>

std::vector<std::string> split(const std::string& s, const std::string& delim) {
    std::vector<std::string> tokens;
    size_t start = 0, end = 0;
    while ((end = s.find(delim, start)) != std::string::npos) {
        tokens.push_back(s.substr(start, end - start));
        start = end + delim.length();
    }
    tokens.push_back(s.substr(start));
    return tokens;
}

總結

  • 指針數組+strtok是C語言風格的經典做法,理解指針操作有助於掌握底層機制
  • 實際C++項目中優先使用std::string和STL容器,避免內存管理錯誤
  • strtok非線程安全,多線程環境下應使用strtok_r或C++標準庫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved