搜尋
首頁後端開發C#.Net教程strtok函數的用法是什麼

strtok函數的用法是什麼

Oct 28, 2020 am 09:48 AM
strtok函數

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

strtok函數的用法是什麼

相關免費推薦:程式設計影片課程

strtok函數的用法:

##一、函數的簡介

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

         功能:作用於字串s,以delim中的字元為分界符,將s切割分成一個個子字串;如果,s為空值NULL,則函數保存的指標SAVE_PTR在下AVE_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 = " ",即空格為分界符。

strtok函數的用法是什麼 

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

strtok函數的用法是什麼

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

 

了解buffer的變化,就很好解釋函數的回傳值了。傳回值buf為分界符之前的子字串(其實這個說法並不確切,詳見"3」中對於傳回值的詳細說明)。 注意,由變數的位址可知,buf仍指向來源字串。

strtok函數的用法是什麼

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

 

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

strtok函數的用法是什麼

####

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

strtok函數的用法是什麼# ,strtok函數的用法是什麼 。 。 。 。以此類推。 。 。 。 。

至於為什麼要賦空值,要嘛你就記得結論,要嘛去查strtok的原始碼。本文的最後會有一些介紹。

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

 

3.關於函數傳回值的探討

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

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

strtok函數的用法是什麼

由上圖可以看到buffer中並不包含分界符delim。呼叫strtok後buf的值為

strtok函數的用法是什麼

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

什麼時候函數的回傳值為空值NULL呢?

百度百科上說,「當沒有分割的字串時則回傳NULL。」這是一個很模稜兩可的說法。如果想要確切的了解清楚這個問題,可能需要看一下strtok的實作原理。這裡先以實驗說明。

strtok函數的用法是什麼

第一次呼叫strtok,毫無疑問,buf指向",Fred」。

第二次呼叫strtok,由於第一個參數為NULL,表示函數繼續以上次呼叫所儲存的this指標的位置開始分解,即對"male 25」分解。分解完畢後,buf指向"male」。

第三次呼叫strtok,參數繼續設定為NULL,此時即對第二次儲存的this指標的位置開始分解,即對"25」分解。因為無法找到包含分隔符號delim的子字串,所以buf指向"25」。

strtok函數的用法是什麼

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

strtok函數的用法是什麼

## 

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

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

strtok函數的用法是什麼

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

strtok函數的用法是什麼

第一次呼叫之後的結果竟然是"Fred”,而非我們所想的結果。 這是為什麼呢?

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

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

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

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

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

strtok函數的用法是什麼

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

6.不能傳遞字串常數給第一個參數!

本文所舉的例子都將來源字串儲存為字串陣列變數。若你將來源字串定義成字串常數,可想而知,程式會因為strtok函數試圖修改來源字串的值,而拋出異常。

strtok函數的用法是什麼

#

以上是strtok函數的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
C#.NET開發:入門的初學者指南C#.NET開發:入門的初學者指南Apr 18, 2025 am 12:17 AM

要開始C#.NET開發,你需要:1.了解C#的基礎知識和.NET框架的核心概念;2.掌握變量、數據類型、控制結構、函數和類的基本概念;3.學習C#的高級特性,如LINQ和異步編程;4.熟悉常見錯誤的調試技巧和性能優化方法。通過這些步驟,你可以逐步深入C#.NET的世界,並編寫高效的應用程序。

c#和.net:了解兩者之間的關係c#和.net:了解兩者之間的關係Apr 17, 2025 am 12:07 AM

C#和.NET的關係是密不可分的,但它們不是一回事。 C#是一門編程語言,而.NET是一個開發平台。 C#用於編寫代碼,編譯成.NET的中間語言(IL),由.NET運行時(CLR)執行。

c#.net的持續相關性:查看當前用法c#.net的持續相關性:查看當前用法Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

從網絡到桌面:C#.NET的多功能性從網絡到桌面:C#.NET的多功能性Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#.NET與未來:適應新技術C#.NET與未來:適應新技術Apr 14, 2025 am 12:06 AM

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

c#.net適合您嗎?評估其適用性c#.net適合您嗎?評估其適用性Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代碼:探索編程過程.NET中的C#代碼:探索編程過程Apr 12, 2025 am 12:02 AM

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

C#.NET:探索核心概念和編程基礎知識C#.NET:探索核心概念和編程基礎知識Apr 10, 2025 am 09:32 AM

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前By尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。