1. 程式人生 > >C語言字串擷取函式strtok和strtok_r

C語言字串擷取函式strtok和strtok_r

       在看原始碼的時候需要將一段並排的IPs轉化成為一系列的IP,將"10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5"轉換成為單獨的"10.0.0.1","10.0.0.2","10.0.0.3","10.0.0.4","10.0.0.5"。就是一個將一個字串切割成為多個字串的問題。考慮C語言中的strtok以及strtok函式。

1.strtok

原型:char *strtok(char s[], const char *delim)

功能:分解字串為一組字串。s為要分解的字串,delim為分隔符字串。

2.strtok_r

原型:char *strtok_r(char *str, const char *delim, char **saveptr)

strtok_r函式是strtok函式的可重入版本。str為要分解的字串,delim為分隔符字串。char **saveptr引數是一個指向char *的指標變數,用來在strtok_r內部儲存切分時的上下文,以應對連續呼叫分解相同源字串。

函式strtok_r是函式strtok的可重入版本,也即執行緒安全版本。在函式strtok中剩餘字串是儲存在一個靜態變數中,因此,多執行緒在使用該靜態變數時引起衝突;而strtok_r則使用使用者傳入的指標為每個使用者saveptr重新申請變數,因而可以保證執行緒安全。

可重入函式:重入即表示重複進入,首先它意味著這個函式可以被中斷,其次意味著它除了使用自己棧上的變數以外不依賴於任何環境(包括static),這樣的函式就是purecode(純程式碼)可重入,可以允許有該函式的多個副本在執行,由於它們使用的是分離的棧,所以不會互相干擾。如果確實需要訪問全域性變數(包括static),一定要注意實施互斥手段。可重入函式在並行執行環境中非常重要,但是一般要為訪問全域性變數付出一些效能代價。

舉個栗子:

#include<iostream>
#include<cstdlib>
#include<string.h>

using namespace std;


int strtok(char *pSrc)
{
    char *pToken = NULL;
    char *pDelimiter = ";";
    pToken = strtok(pSrc,pDelimiter);
    cout<<"Strtok Begin:"<<endl; 
    while(pToken)
    {
        cout<<"pToken:"<<pToken<<endl;
        pToken = strtok(NULL,pDelimiter);
    }
    cout<<"Strtok End!"<<endl<<endl;
}


int strtok_r(char *pSrc)
{
    char *pToken = NULL;
    char *pLeft = NULL;
    char *pDelimiter = ";";

    pToken = strtok_r(pSrc,pDelimiter,&pLeft);
    cout<<"Strtok_r Begin:"<<endl;
    while(pToken)
    {
        cout<<"pToken:"<<pToken<<" pLeft:"<<pLeft<<endl;
        pToken = strtok_r(NULL,pDelimiter,&pLeft);
    }
    cout<<"Strtok_r End!"<<endl<<endl;

}



int main()
{
    char pSrc[] = "10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5;10.0.0.6";
    strtok(pSrc);
    char pSrc1[] = "10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5;10.0.0.6";
    strtok_r(pSrc1);
    return 0;
}
執行結果:



Author:憶之獨秀

Email:[email protected]

註明出處:http://blog.csdn.net/lavorange/article/details/47134121


相關推薦

C語言字串擷取函式strtokstrtok_r

       在看原始碼的時候需要將一段並排的IPs轉化成為一系列的IP,將"10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5"轉換成為單獨的"10.0.0.1

C 語言字串分割函式 p = strtok(NULL, " ");

原始碼: #include <stdio.h> #include<string.h> int main() { char str[] = "經度:111°11’11'' 緯度: 30°30'30''"; char *p; char a[]=" "

(C/C++學習)14.C語言字串處理函式(二)

說明:上節著重解釋了字串處理的庫函式處理,這節將針對一些常用的需求,進行非庫函式的處理。 一.去除某一個字串中的某個字元 1.去除字串右邊的空格 1 void trimStrRightSpace(char * str) 2 { 3 while(*str) 4 s

14. C語言 -- 字串處理函式

本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。 也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。

常用的c語言字串處理函式

1.獲取一個字串 char *p = fgets(buf, size, stdin);   2.字串查詢     ret = strstr(cmd, "test");     if(ret != NULL)    

C語言指標回顧——函式指標指標函式

函式指標 函式指標和指標函式兩個詞很像,但實際上只要看後兩個詞就行,函式指標是一個指標,指標是用來存放變數地址的,函式指標存放的地址是函式的入口地址。那麼函式指標如何使用呢,請看下面的程式碼: #include <iostream> using namespa

c語言字串簡單函式簡單應用

    //記憶字串的函式      //1.strcpy賦值函式的用法;      /*char a[50]="hello world";     char b[50];     strcpy(b,a);     printf("%s",b);*/          //2

C語言字串處理函式

1、puts(字串陣列) ,gets(字串陣列) 2、strcat(字串陣列1,字串陣列2) 把字串陣列2接到字串陣列1中。 3、strcpy(字串陣列1,字串陣列2) 把字串陣列2複製到字串陣列1中。 strncpy(字串陣列1,字串陣列2,n),將字串2中前n個

C語言:通過函式指標引數來呼叫函式

C語言可以通過函式指標來呼叫函式,可以將要呼叫的函式名儲存到陣列中。這樣我們可以通過引數來直接呼叫函數了。 #include <stdio.h> #define FUNCTIONSIZE 2 typedef unsigned char uint8_t;

C語言字串分割函式split實現

#include <stdlib.h> #include <string.h> #include <stdio.h> /* 用delimiter中的每一個分隔符分割str字串,這並不會改變str中的字元,然後返回一個字串陣列. 字串陣列中的字串有可能是以'\0'開頭的空串

C語言字串操作函式

C語言中(部分)字串操作函式簡介 strlen(p); // 計算指定的字串p的長度,不包括結束字元'\0' strcpy(p, p1); // 複製字串  strncpy(p, p1, n); // 複製指定長度字串  strcat(p, p1);

C語言字串匹配函式

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <assert.h> 5 #include <time.h>

cc++中字串處理函式strtok,strstr,strchr,strsub

函式原型:char *strtok(char *s, char *delim); 函式功能:把字串s按照字串delim進行分割,然後返回分割的結果。 函式使用說: 1.strtok函式的實質上的處理是,strtok在s中查詢包含在delim中的字元並用NULL(’/0′)來替換,直到找遍整個字串。這句

C語言入門:函式定義呼叫

一,函式定義 舉例: 例子1: int FunctionDamon1(); /* 這個函式宣告包含了“ 返回值型別 函式名稱 和括號()” , 沒有函式引數,有函式引數的例子如下*/ 例子2; int FunctionDamon2(int valua

C語言字串查詢函式

轉自:blog.csdn.net/minpro //此函式的功能是在一個長字串中,查詢子串 //僅保留,以便使用,請勿見笑! /***********************************************************************

C語言字串操作函式總結

Part 1: Copying 1、函式名: strcpy 用法: char * strcpy ( char * destination, const char * source ); 功能: 串拷貝(

C++ primer plus書之--C++函式C語言字串, 結構體, string

函式和C風格字串 要將C風格字串作為引數傳遞給函式, 表示字串的方式有三種: 1.char陣列 2.用""擴起來的字串常量 3.被設定為字串地址的char指標 來看一個例子: // c風格字串例子 #include "iostream" using namespace std

c語言的split字串分割函式strtok的使用

c語言也有類似其他語言的split字串分割函式,就是strtok 標頭檔案:#include <string.h>定義函式:char * strtok(char *s, const char *delim);函式說明:strtok()用來將字串分割成一個個片段。

C語言實現的字串擷取函式

如題,實現的就是字串擷取函式,傳入字串以及要擷取的位置,返回擷取後的字串,函式如下,測試可用。 char *cutwords(char *page,int start,int end){ ch

一個字串擷取函式c語言

剛開始學習c語言,標準庫中總是有很多函式沒有,string.h中的字串處理函式好像不是很多,在做棧的例子用需要用到一個字串按位置擷取的函式,就自己寫一個,超簡單。 char* substring(char* ch,int pos,int length) { char