核心函數:strtok 分割
#include <stdio.h>
#include <string.h>
void split(char **arr, char *str, const char *del) {
char *s = strtok(str, del);
while (s != NULL) {
*arr++ = s; // 保存分割後的指針
s = strtok(NULL, del); // 繼續分割
}
}
完整示例程序
int main() {
char str[] = "10,20,30,40,50"; // 必須可修改(strtok 會修改原字符串)
char *arr[10]; // 指針數組存儲分割結果
const char *del = ",";
int i = 0;
split(arr, str, del);
while (i < 10 && arr[i] != NULL) {
printf("arr[%d] = %s\n", i, arr[i]);
i++;
}
return 0;
}
關鍵點詳解
| 點 | 說明 |
strtok 修改原串 | 將分隔符替換為 \0,原字符串被破壞,需備份 |
| 非線程安全 | 內部靜態狀態,多線程需用 strtok_r (POSIX) 或 strtok_s (C11) |
| 連續分隔符 | 視為一個分隔符(跳過空字段),如需保留空字段需手寫解析 |
| 返回指針 | 指向原字符串內部,原串釋放/修改會導致懸空指針 |
進階:保留空字段的手寫分割
int split_keep_empty(char **out, const char *str, char delim, int max) {
int count = 0;
const char *start = str;
while (*str && count < max - 1) {
if (*str == delim) {
int len = str - start;
out[count] = malloc(len + 1);
memcpy(out[count], start, len);
out[count][len] = '\0';
count++;
start = str + 1;
}
str++;
}
// 最後一段
if (count < max) {
int len = str - start;
out[count] = malloc(len + 1);
memcpy(out[count], start, len);
out[count][len] = '\0';
count++;
}
out[count] = NULL;
return count;
}
內存管理提醒
strtok 版本:無需 free,指向原數組內存
- 手寫版本:必須 free 每個 out[i]
- 若需持久化副本:
strdup(s) 或 malloc+strcpy
總結
C 語言分割字符串存入數組:strtok + 指針數組 最簡潔高效。注意原串修改、線程安全、指針生命週期。生產代碼建議封裝為安全的工具函數。
- 上一篇文章: 酷狗音樂 Web 版為何不採用全屏自適應布局?
- 下一篇文章: Oracle 11g 與 PL/SQL Developer 連接配置圖文教程
Copyright ©
程式碼之家 All Rights Reserved