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

results matching ""

    No results matching ""