日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php strtok函数,strtok函数的用法是什么

發布時間:2023/12/20 php 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php strtok函数,strtok函数的用法是什么 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

strtok函數的用法:1、作用于字符串s,以delim中的字符為分界符,將s切分成一個個子串;2、如果s為空值NULL,則函數保存的指針【SAVE_PTR】在下一次調用中將作為起始位置。

相關免費推薦:編程視頻課程

strtok函數的用法:

一、函數的簡介

函數原型:char *strtok(char *s, char *delim)

功能:作用于字符串s,以delim中的字符為分界符,將s切分成一個個子串;如果,s為空值NULL,則函數保存的指針SAVE_PTR在下一次調用中將作為起始位置。

返回值:分隔符匹配到的第一個子串

二、主要內容

1、函數的作用是分解字符串,所謂分解,即沒有生成新串,只是在s所指向的內容首次出現分界符的位置,將分界符修改成了'/0’,故第一次用strtok()返回第一個子串

2、第一次提取子串完畢之后,繼續對源字符串s進行提取,應在其后(第二次,第三次。。。第n次)的調用中將strtok的第一個參數賦為空值NULL(表示函數繼續從上 一次調用隱式保存的位置,繼續分解字符串;對于前一次次調用來說,第一次調用結束前用一個this指針指向了分界符的下一位)

3、當this指針指向“\0” 時,即沒有被分割的子串了,此時則返回NULL

4、可以把delim理解為分隔符的集合,delim中的字符均可以作為分隔符。

5、strtok在調用的時候,如果起始位置即為分隔符,則忽略了起始位置開始的分隔符

三、使用strtok需要注意的有以下幾點:

1.函數的作用是分解字符串,所謂分解,即沒有生成新串,只是在s所指向的內容上做了些手腳而已。因此,源字符串s發生了變化!

設源字符串s為 char buffer[INFO_MAX_SZ]=",Fred male 25,John male 62,Anna female 16"; 過濾字符串delim為 char *delim = " ",即空格為分界符。

上圖的代碼會產生這樣的結果:

首先,buffer發生了變化。如果此時打印buffer的值,會顯示“,Fred”,而后面" male 25…16”不翼而飛了。實際上,strtok函數根據delim中的分界符,找到其首次出現的位置,即Fred后面那個空格(buffer[5]),將其修改成了'/0’。其余位置不變。這就很好解釋為什么打印buffer的值只能出現“,Fred”,而非buffer中的全部內容了。因此,使用strtok時一定要慎重,以防止源字符串被修改。

理解了buffer的變化,就很好解釋函數的返回值了。返回值buf為分界符之前的子串(其實這個說法并不確切,詳見"3”中對于返回值的詳細說明)。注意,由變量的地址可知,buf依然指向源字符串。

分界符delim沒有發生變化,就不再截圖了。

2.若要在第一次提取子串完畢之后,繼續對源字符串s進行提取,應在其后(第二次,第三次。。。第n次)的調用中將strtok的第一個參數賦為空值NULL。

第一次調用的結果如前文所述,提取出了",Fred”。我們還想繼續以空格為分界,提取出后面的"male”等。由上圖可以看到,第一次之后的調用我們都給strtok的第一個參數傳遞了空值NULL(表示函數繼續從上一次調用隱式保存的位置,繼續分解字符串;對于上述的第二次調用來說,第一次調用結束前用一個this指針指向了分界符的下一位,即'm’所在的位置),這樣可依次提取出

。。。。以此類推。。。。。

至于為什么要賦空值,要么你就記住結論,要么去查strtok的源代碼。本文的最后會有一些介紹。

當然也有部分愛鉆牛角尖的人,非不按套路出牌,要看看不賦空值繼續賦值為buffer會有什么結果。其實,答案想也能想的到。再一次傳遞buffer,相當于還從字符串的開頭查找分界符delim,而且此時buffer已經被修改(可見的部分只剩下",Fred”),因此,其結果必然是找不到分界符delim。

3.關于函數返回值的探討

由"1”中所述,在提取到子串的情況下,strtok的返回值(假設返回值賦給了指針buf)是提取出的子串的指針。這個指針指向的是子串在源字符串中的起始位置。子串末尾的下一個字符在提取前為分隔符,提取后被修改成了'/0’。因此,若打印buf的值,可以成功的輸出子串的內容。

在沒有提取到子串的情況下,函數會返回什么值呢?

由上圖可以看到buffer中并不包含分界符delim。調用strtok后buf的值為

因為沒有找到,源字符串buffer沒有發生改變,buf指向源字符串的首地址,打印輸出的值為整個字符串的完整值。

什么時候函數的返回值為空值NULL呢?

百度百科上說,“當沒有被分割的串時則返回NULL?!边@是一個很模棱兩可的說法。如果想要確切的了解清楚這個問題,可能需要看一下strtok的實現原理。這里先以實驗說明。

第一次調用strtok,毫無疑問,buf指向",Fred”。

第二次調用strtok,由于第一個參數為NULL,表示函數繼續以上次調用所保存的this指針的位置開始分解,即對"male 25”分解。分解完畢后,buf指向"male”。

第三次調用strtok,參數繼續設定為NULL,此時即對第二次保存的this指針的位置開始分解,即對"25”分解。因為無法找到包含分隔符delim的子串,所以buf指向"25”。

第四次調用,參數仍為NULL,此時第三次調用保存的this指針已指向字符串的末尾'/0’,已無法再進行分解。因此函數返回NULL,這也就是百度百科中所提到的“當沒有被分割的串時函數返回NULL?!?/p>

4.參數 分隔符delim的探討(delim是分隔符的集合)

很多人在使用strtok的時候,都想當然的以為函數在分割字符串時完整匹配分隔符delim,比如delim=”ab”,則對于"acdab”這個字符串,函數提取出的是"acd”。至少我在第一次使用的時候也是這么認為的。其實我們都錯了,我是在看函數的源代碼時才發現這個問題的,且看下面的例子。

源字符串為buffer,分隔符delim為 逗號和空格,按照一般的想法我們會以為調用函數后,buf的值為"Fred,male,25”,結果是這樣么?

第一次調用之后的結果竟然是"Fred”,而非我們所想的結果。這是為什么呢?

我們回到GNU C Library中對strtok的功能定義:“Parse S into tokens separated by characters in DELIM”。也就是說包含在delim中的字符均可以作為分隔符,而非嚴格匹配??梢园裠elim理解為分隔符的集合。這一點是非常重要的~

當然,我們在分解字符串的時候,很少使用多個分隔符。這也導致,很多人在寫例子的時候只討論了一個分隔符的情況。有更多的人在看例子的時候也就錯誤的認識了delim的作用。

5.待分解的字符串,首字符就為分隔符

首字符為分隔符不能算作一個很特殊的情況。按照常規的分解思路也能正確分解字符串。

我想說明的是,strtok對于這種情況采用了比常規處理更快的方式。

如上圖例子所示。僅用一次調用就可以得到以逗號分隔的字符串"Fred male 25”,而F前面的','被忽略了。由此可見,strtok在調用的時候忽略了起始位置開始的分隔符。這一點,可以從strtok的源代碼得到證實。

6.不能向第一個參數傳遞字符串常量!

本文中所舉的例子都將源字符串保存為字符串數組變量。若你將源字符串定義成字符串常量,可想而知,程序會因為strtok函數試圖修改源字符串的值,而拋出異常。

總結

以上是生活随笔為你收集整理的php strtok函数,strtok函数的用法是什么的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: xxxxxhd亚洲人hd | 精品人妻一区二区三区三区四区 | 欧美一区网站 | 成人一区二区三区在线 | 日韩国产在线一区 | 蜜乳av懂色av粉嫩av | 日韩欧美国产片 | 欧美日韩不卡在线 | 国精产品一区一区三区免费视频 | 色福利在线 | 日本a∨视频 | 午夜免费一级片 | 国产成人短视频 | 亚洲天堂精品在线 | 日本高清免费aaaaa大片视频 | 久久婷婷综合色 | 91狠狠爱| 91av视频网 | 丰满秘书被猛烈进入高清播放在 | 黄在线视频 | 日韩在线一二三 | 欧美成人午夜精品免费 | 欧美一级免费观看 | 不卡日韩 | 国产一区二区色 | 精品人妻一区二区三区三区四区 | 在线免费看91 | 欧美日韩专区 | 婷婷综合在线 | 黄色日本视频 | 91人妻一区二区 | 亚洲免费不卡视频 | 亚洲欧美日韩在线一区二区 | 亚洲成人av综合 | 日韩欧美国产中文字幕 | 拔插拔插海外华人免费视频 | 婷婷亚洲天堂 | 日韩最新网址 | 国产精品资源 | 制服丝袜影音先锋 | 国产福利在线播放 | 伊人久久色 | 午夜精品视频在线 | eeuss鲁丝片一区二区三区 | 欧美高清69hd| 岛国av一区二区三区 | 三级视频网站在线观看 | 黄片毛片av | 国产性―交―乱―色―情人 | 一亲二脱三插 | 国产精品亚洲αv天堂无码 伊人性视频 | 大乳护士喂奶hd | 久草新在线 | 97人人超 | a√在线视频 | 欧美日韩一区二区三区不卡 | 国产精品6| 狠狠做深爱婷婷久久综合一区 | 日韩精品一区在线观看 | 又白又嫩毛又多15p 超碰在线一区 | 91免费 看片 | 天天干天天日夜夜操 | 色妇av| 夜夜骑夜夜骑 | 欧美成人dvd在线视频 | 91色伦| 日本韩国中文字幕 | 午夜精品一区二区三 | 69欧美视频 | 韩国三级hd中文字幕有哪些 | 亚洲精品第二页 | www日本xxx | 色中色在线视频 | 97国产在线观看 | 三级自拍视频 | 欧美乱妇日本无乱码特黄大片 | 人妻久久一区二区 | 91caob | 永久av | 亚洲aa视频 | 97精品一区二区视频在线观看 | 亚洲国产综合在线 | 精品国产av无码一区二区三区 | 精品一区免费观看 | 日韩久久综合 | 中国特级黄色片 | 中文字幕久久久久久久 | 日本久久成人 | 制服师生在线 | 国产丝袜第一页 | 免费av动漫| 妺妺窝人体色WWW精品 | 日本美女逼 | 午夜狠狠干 | 日日狠狠久久偷偷四色综合免费 | 天天操天天干视频 | 国产精品电影在线观看 | 亚洲永久无码精品 | 在线播放中文字幕 |