字符串分割SplitString
C/C++中常用的字符串切割函数有strtok、strtok_s与strtok_r。
strtok函数
char* strtok(char* str, const char* delim);
分解字符串str为一组字符串,delim为分隔符。当strtok在參数str的字符串中发现參数delim中包含的切割字符时,则会将该字符改为'\0'字符。在第一次调用时,strtok必需给予參数str字符串,往后的调用则将參数str设置成NULL。每次调用成功则返回指向被切割出片段的指针。
strtok_s函数
char* strtok_s( char* strToken, const char* strDelimit, char** buf);
strtok_s是windows下的一个切割字符串安全函数,该函数会将剩余的字符串存储在buf变量中,而不是静态变量中,从而保证了安全性。
strtok_r函数
char* strtok_r(char* str, const char* delim, char** saveptr);
strtok_r函数是linux下切割字符串的安全函数,该函数会破坏待分解字符串的完整性,可使其将剩余的字符串保存在saveptr变量中,保证了安全性。
SplitString实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void SplitString (char* str, char* delim, char** result) {
char* ptr = NULL;
char* tmp = NULL;
ptr = strtok_r(str, delim, &tmp);
int count = 0;
const int maxLineLen = 100;
while (ptr != NULL) {
memcpy(result[count], ptr, maxLineLen);
ptr = strtok_r(NULL, delim, &tmp);
++count;
}
}
void SplitStringTest () {
const int maxLineNum = 20;
const int maxLineLen = 100;
char str1[] = "This is a test Program!";
// char str1[] = "Indulge not in heedlessness, have no intimacy with sensuous delights; for the earnest, meditative person obtains abundant bliss.";
char str2[] = " ";
char* result[maxLineNum] = {0};
for (int i = 0; i < maxLineNum; ++i) {
result[i] = (char*)malloc(sizeof(char) * maxLineLen);
if (result[i] != NULL) {
memset(result[i], 0, maxLineLen);
} else {
return;
}
}
SplitString(str1, str2, result);
for (int i = 0; i < maxLineNum; ++i) {
printf("%s\n", result[i]);
}
for (int i = 0; i < maxLineNum; ++i) {
if (result[i] != NULL) {
free(result[i]);
result[i] = NULL;
}
}
}
int main () {
SplitStringTest();
return 0;
}
个人主页: