split 切割字串
Prerequisites:
切割字串 = aa,bb,cc,dd,ee,ff
切割符號 = ,
儲存二維陣列 values[10][50]
第一次循環
字串 | aa | , | bb | , | cc | , | dd | , | ee | , | ff |
p | ^ | ||||||||||
find | ^ |
第二次循環
字串 | aa | , | bb | , | cc | , | dd | , | ee | , | ff |
p | ^ | ||||||||||
find | ^ |
最後一次循環,find已經找不到切割符號
字串 | aa | , | bb | , | cc | , | dd | , | ee | , | ff |
p | ^ | ||||||||||
find |
完整程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
str 要切割的字串
splitStr 切割符號
values儲存的結果陣列
**/
size_t splitstr(const char* str,const char* splitStr, char values[][50]) {
//若位址為空,傳回0
if(str == 0 || splitStr == 0) return 0;
size_t slen = strlen(splitStr);//split符號長度
if(slen == 0) return 0;//若符號長度為0,就不用切割
//強制轉型const char* str轉成char*
char *p = (char*)str;
//aa,bb,cc,dd,ee,ff
//切割符號為逗號,切割的個數為6個,分別為aa|bb|cc|dd|ee|ff
size_t size = 0;//記錄切割的個數
while(true) {
//找尋切割符號第一個位置
char* find = strstr(p, splitStr);
//如果找到
if(find != 0) {
//截取p的位置到切割符號之前的字元個數
//參數1要儲存的位址
//參數2要拷貝的開始位址
//參數3要拷貝的個數
strncpy(values[size++], p, find - p);
//將p指標移到切割符號右邊的字元
p = find + slen;
} else {
//如果找不到切割符號
//代表是最後一個字串
strcpy(values[size++], p);
break;//跳出無限迴圈
}
}
return size;
}
int main() {
char values[10][50];
memset(values, 0, sizeof(values));
//傳回切割個數
size_t count = splitstr("aa,bb,cc,dd,ee,ff", ",", values);
cout << "count = " << count << endl;
for(int i = 0; i < count; i++) {
cout << "values[" << i << "] = " << values[i] << endl;
}
return 0;
}
count = 6
values[0] = aa
values[1] = bb
values[2] = cc
values[3] = dd
values[4] = ee
values[5] = ff