2015年10月1日 星期四

[Linux C] strtok與strtok_r使用教學、程式實作


前言

當我們在使用C語言做字串分割時,大家都知道string.h的library裡面,有很好用的function可以調用,而這function就是strtokstrtok_r

不知道有沒有人跟我一樣國文造詣實在很差,看了看網路上的文章還是不是很懂在這函式的運作方法…所以我就來看一下Source Code,並寫一個簡易的程式來讓大家理解理解用法吧!




------

簡介

想必在網路上最容易找到strtok的用法,我個人認為strtok_r反而是比較直觀的做法…所以接下來我都使用strtok_r做範例!

首先我們來看看strtok家族的長相吧!



str: 被切割的字串起始記憶體位址。
delim: 切割條件。
saveptr: ...


想了快一個小時,我也想不到好方法表達我想說的內容…可見我國文多爛ˊ口ˋ|

直接來看圖範例吧!!

--------

範例

假設:
str = "ab,,cd,,,ef";
delim = ",";

呼叫函式方法: token = strtok_r ( str, delim, &saveptr);
執行結果會如下圖:



------

實作

以下是個簡單的範例程式,搭配上面的圖解應該不難了解吧!

注意:為了方便觀察,string_show函式內裡面把 '\0'都改成顯示 '*'

strtok_r.c

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

static void string_show(char *str_in, int len)
{
 int i;

 for (i = 0; i < len; i++)
 {
  if ( *(str_in + i) != '\0')
   printf("%c", *(str_in + i));
  else  
   printf("%c", '*');
 }
 printf("\n");
}

int main(void)
{
 int len = 0, count = 0;
 char  *str = NULL,
  *delim = ",",
  *token = NULL,
   *rest_of_str = NULL;

 str = strdup("123,456,789,,5566,2266,,,1999,2015");
 
 //record the length of the origin str.
 len = strlen(str);

 //start strtok_r

 token = strtok_r( str, delim, &rest_of_str);
 count++;


 while( token != NULL)
 {
  printf("\n-------------count:%d-------------\n", count);
  printf("str:");
  string_show(str, len);
  printf("token:%s\n", token);
  printf("rest_of_str:%s\n", rest_of_str);
  printf("----------------------------------\n");
 
  token = strtok_r( rest_of_str, delim, &rest_of_str);
  count++;
 }
 
 free(str);
}

執行結果


沒有留言:

張貼留言