1. 程式人生 > >字串函式之Strtok()函式

字串函式之Strtok()函式

Strtok()函式詳解:

  該函式包含在"string.h"標頭檔案中
函式原型:

  1. char* strtok (char* str,constchar* delimiters );

函式功能:
  切割字串,將str切分成一個個子串
函式引數:
  str:在第一次被呼叫的時間str是傳入需要被切割字串的首地址;在後面呼叫的時間傳入NULL。
  delimiters:表示切割字串(字串中每個字元都會 當作分割符)。
函式返回值:
  當s中的字元查詢到末尾時,返回NULL;
  如果查不到delimiter所標示的字元,則返回當前strtok的字串的指標。

使用strtok()函式:

  1. #include<stdio.h>
    #include<string.h>
    int main(void)
    {
        char buf[]="[email protected]@[email protected]@heima";
        char*temp = strtok(buf,"@");
        while(temp)
        {
            printf("%s ",temp);
            temp = strtok(NULL,"@");
        }
        return0;
    }

預計輸出結果:

  "hello boy this is heima "

實際執行結果:

得到的結論:
  strtok在切割字串的時間,實際上就是將分割符的字元delimiter替換為'\0'並且返回首地址。

自己實現strtok()函式原理:

函式程式碼:

  1. #include<stdio.h>
    #include<string.h>
    //根據函式原型實現strtok()函式
    char* myStrtok_origin(char* str_arr,constchar* delimiters,char**temp_str)
    {
        //定義一個指標來指向待分解串
        char*b_temp;
        /*
        * 1、判斷引數str_arr是否為空,如果是NULL就以傳遞進來的temp_str作為起始位置;
        * 若不是NULL,則以str為起始位置開始切分。
        
    */ if(str_arr == NULL) { str_arr =*temp_str; } //2、跳過待分解字串 //掃描delimiters字元開始的所有分解符 str_arr += strspn(str_arr, delimiters); //3、判斷當前待分解的位置是否為'\0',若是則返回NULL,否則繼續 if(*str_arr =='\0') { return NULL; } /* * 4、儲存當前的待分解串的指標b_temp,呼叫strpbrk()在b_temp中找分解符, * 如果找不到,則將temp_str賦值為待分解字串末尾部'\0'的位置, * b_temp沒有發生變化;若找到則將分解符所在位置賦值為'\0', * b_temp相當於被截斷了,temp_str指向分解符的下一位置。 */ b_temp = str_arr; str_arr = strpbrk(str_arr, delimiters); if(str_arr == NULL) { *temp_str = strchr(b_temp,'\0'); } else { *str_arr ='\0'; *temp_str = str_arr +1; } //5、函式最後部分無論找沒找到分解符,都將b_temp返回。 return b_temp; } //使用myStrtok來簡化myStrtok_origin函式 char* myStrtok(char* str_arr,constchar* delimiters) { staticchar*last; return myStrtok_origin(str_arr, delimiters,&last); } int main(void) { char buf[]="[email protected]@[email protected]@heima"; //1、使用myStrtok_origin()函式 char*temp_str = NULL; char*str = myStrtok_origin(buf,"@",&temp_str); while(str) { printf("%s ",str); str = myStrtok_origin(NULL,"@",&temp_str); } //2、使用myStrtok()函式 char*str1 = myStrtok(buf,"@"); while(str1) { printf("%s ",str1); str1 = myStrtok(NULL,"@"); } return0; }

  完美實現!!!

拓展知識點:可重入與不可重入函式

可重入函式:
  指一個可以被多個任務呼叫的函式(過程),任務在呼叫時不必擔心資料是否會出錯。
不可重入函式:
  如果函式介面的程式碼實現中在塊內定義和使用了static儲存型別的變數,這種函式將是不可重入函式。它在實時系統中是不安全函式

相關推薦

字串函式Strtok()函式

Strtok()函式詳解:   該函式包含在"string.h"標頭檔案中 函式原型: char* strtok (char* str,constchar* delimiters ); 函式功能:   切割字串,將str切分成一個個子串 函式引數:   str:在第一次被呼叫的時間str是

Python函式系統函式的呼叫

全部測試程式碼 #!/usr/bin/evn python3 #_*_conding:utf-8 _*_ #系統內建函式 #1.abs():檢視絕對值,如果傳入的引數不對,會報TypeError print('-100的絕對值--',abs(-100)) #2.max():檢

linux C函式stat函式

1.函式功能: 通過檔名filename獲取檔案資訊,並儲存在buf所指的結構體stat中 2.函式原型 1)函式標頭檔案 #include <sys/stat.h> #include <unistd.h> 2)函式 int stat(const c

C函式memcpy 函式用法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

fflash函式strtok函式exec函式

一、fflush函式 函式定義:int fflush(FILE *stream); 1.fflush會強迫將緩衝區內的資料回寫到引數stream指向的檔案中,如果引數stream為NULL,fllush會將所有開啟的檔案資料更新 2.fflush(stdin)重新整理緩衝區,把緩衝區中

函式高階函式

1:函式可以賦值給一個變數名字 ,函式引數能接收變數 這個函式也可以接收另一個函式的函式名作為引數,那麼這就是一個高階函式ef func1(): print('老王好帥!')def func2(ff): ff() return '老王媳婦好美!'print(func2(func1))2:一個函式可以接收

linux C函式access函式的用法【轉】

1.函式功能: 檢查呼叫程序是否可以對指定的檔案執行某種操作。 2.函式原型: 1)函式標頭檔案 #include <stdio.h> #include <unistd.h> 2)函式 int access(

【 MATLAB 】訊號處理工具箱的訊號產生函式 sawtooth 函式簡記

 sawtooth 函式 x = sawtooth(t) generates a sawtooth wave with period 2π for the elements of the time

C函式memcpy 函式用法

標頭檔案:#include <string.h>memcpy() 用來複制記憶體,其原型為:    void * memcpy ( void * dest, const void * src, size_t num );memcpy() 會複製 src 所指的記憶體內容的前 num 個位元組到 d

Linux程序控制函式exec()函式的學習

           轉載地址:http://www.linuxidc.com/Linux/2011-02/32125p6.htm,   紅色部分, 是我自己的註解。      當我們看恐怖片時,經常會有這樣的場景:當一個人被鬼上身後,這個人的身體表面上還和以前一樣

9、strchr函式&strtok函式&strdup使用

題意: 將字串abcddd#123#gaghah#345#fdsafa#345#中把#之間的數字串替換成對應的字母串 123===》defd 345===》fdse #include<iostream> #include<stdio.h> #include&l

ORACLE函式GREATEST函式詳解例項

1語法GREATEST(expr_1, expr_2, ...expr_n)2說明GREATEST(expr_1, expr_2, ...expr_n)函式從表示式(列、常量、計算值)expr_1, e

c函式gettimeofday()函式獲取系統時間

gettimeofday     使用C語言編寫程式需要獲得當前精確時間(1970年1月1日到現在的時間),或者為執行計時,可以使用gettimeofday()函式。 函式原型:     int gettimeofday(struct timeval*tv, struct

Linux時間函式 gettimeofday() 函式使用方法

一.gettimeofday()函式的使用方法 1.簡介: 在C語言中可以使用函式gettimeofday()函式來得到時間。它的精度可以達到微妙 2.函式原型: #include<

C函式memcpy()函式用法

函式原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址為起始地址的連續n個位元組的資料複製到以destin指向地址為起始地址的空間內。 標頭檔案 #include<

Oracle-23-單行函式日期函式

一、單行函式之日期函式 1.trunk(x[,y])——對x進行截斷; 2.round(x[,y])——對x進行取整; 3.next_day(x,day)——返回從x開始,一個day的日期; 4.mo

jmeter函式時間函式__time

企鵝交流群>79642549 常用於帶時間戳的地方 比如:帶時間戳的結果檔案,每次執行生成獨立檔案 ${__time(,)} 1450056496991 //無格式化引數,

Linux時間函式gettimeofday()函式使用方法

一.gettimeofday()函式的使用方法:1.簡介:在C語言中可以使用函式gettimeofday()函式來得到時間。它的精度可以達到微妙2.函式原型:#include<sys/time.h>int gettimeofday(struct  timeval*

Linux 時間函式 gettimeofday() 函式使用方法

一.gettimeofday() 函式的使用方法: 1.簡介: 在 C 語言中可以使用函式 gettimeofday() 函式來得到時間。它的精度可以達到微妙 2.函式原型: #include<sys/time.h> int gettimeofday(stru

SQL server 內建函式隨機函式newid()和rand()

從A表隨機取2條記錄,用SELECT TOP 10 * FROM ywle order by newid() order by 一般是根據某一欄位排序,newid()的返回值 是uniqueidentifier ,order by newid()隨機選取記錄是如何進行的