一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 帶你用C語言實現strtok和字符串分割函數

帶你用C語言實現strtok和字符串分割函數

2022-01-06 13:30^jhao^ C/C++

下面小編就為大家帶來一篇c語言中字符串分割函數及實現方法。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

字符串分割函數strtok,大家可能都知道他怎么使用,一旦要用的時候就會心生疑惑,不知道它的內部的實現,廢話不多說,本篇就來帶大家看看strtok的基本使用和實現

 

一、strtok的基本使用

帶你用C語言實現strtok和字符串分割函數

解析:函數大概說了以下幾點

1.str就是我們要去拆分的字符串,注意,我們會對該字符串進行更改,所以一般我們會拷貝一份然后去分割拷貝的那份字符串!!

2.delimiters 就是我們定義的切分的符號,假如想要用空格作為分割符,我們就可以定義chardelimiters [NUM]=" " ** 請注意里面放了一個空格的呀!!
此處NUM可以自己定義大小,這里的delimiters 可以有多種分割方式。

3.strtok函數的第一個參數不為 NULL ,函數將找到str中第一個標記,strtok函數將會有一個設置保存他修改了的下一個位置的地址,如“wo ai ni”,其中若用空格作為分隔符就會將空格處換成*"\n"**,返回w的位置,并且函數內部保存a的位置。

4.strtok函數的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置(即上面所說的位置w)開始,查找下一個標記。

5.如果字符串中不存在更多的標記,則返回 NULL 指針。

分析完后我們看一段代碼,對一段字符串做一個切割

int main()
{
	char a[] = "wo shi bo zhu";
	char* retArr[10];
	retArr[0] = strtok(a, " ");
	int i = 1;
	while (retArr[i++] = strtok(NULL, " "));
	for (int i = 0; i < 10; i++)
	{
		printf("%s ", retArr[i]);
	}
	return 0;
}

帶你用C語言實現strtok和字符串分割函數

 

二、strtok的實現

分析:進來的情況大致分為兩種,str為空和不為空的情況,函數第一次調用的話因為我們要記錄下一次進來時的位置,我們選擇在函數內部創建一個static的靜態變量,static char* p_last = NULL ,并且第一次我們設置為NULL,函數又分為兩種情況,我們切割的話用tmp指針往后走,str指針保存當前位置,所以tmp指針走到\0時我們還要將p_last處理成NULL,其他的情況(str串還能被delimiters分隔)我們就在函數內部把*tmp = ‘\0',再將p_last處理為下一次進來的位置即可

例子:

int main()
{
	char a[] = "wo ai ni";
	char* retArr[10];
	retArr[0] = my_strtok(a, " ");
	int i = 1;
	while (retArr[i++] = my_strtok(NULL, " "));
	for (int i = 0; i < 10; i++)
	{
		printf("%s ", retArr[i]);
	}
	return 0;
}

第一次分割

帶你用C語言實現strtok和字符串分割函數

第二次分割

帶你用C語言實現strtok和字符串分割函數

第三次分割

帶你用C語言實現strtok和字符串分割函數

第四次切割

帶你用C語言實現strtok和字符串分割函數

實現代碼如下,有需要自取:

char* my_strtok(char* str, char* delimiters)
{
	//str傳NULL的時候如果上次有記錄,則用上一次的下一個位置,不然就為NULL
  static char* p_last = NULL;
	if (str == NULL && p_last == NULL)
		return NULL;
	if (str == NULL)
	{
		//用來返回的當前位置
		str = p_last;
		char* tmp = p_last;
		int len = strlen(delimiters);
		while (*tmp)
		{
			for (int i = 0; i < len; ++i)
			{
				if (*tmp == delimiters[i])
				{
					p_last = tmp+1;
					*tmp = '\0';
					return str;
				}
			}
			//走到這里表示當前的tmp沒有在delimiters中能找到的
			tmp++;
		}
		//走到這里就是自己走到斜杠\0的位置,就要將p_last 設置成為NULL
		char* ret = p_last;
		p_last = NULL;
		return ret;
	}
	else
	{
		char* tmp = str;
		int len = strlen(delimiters);
		while (*tmp)
		{
			for (int i = 0; i < len; ++i)
			{
				if (*tmp == delimiters[i])
				{
					p_last = tmp+1;
					*tmp = '\0';
					return str;
				}
			}
			//走到這里表示當前的tmp沒有在delimiters中能找到的
			tmp++;
		}
		//找到了,找不到
		char* ret = p_last;
		p_last = NULL;
		return ret;
	}
}

 

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://blog.csdn.net/weixin_52344401/article/details/120220585

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
主站蜘蛛池模板: 亚洲午夜视频 | 亚洲精品久久久WWW游戏好玩 | 欧美日韩人成在线观看 | 视频在线观看大片 | 国产婷婷高清在线观看免费 | 国产一区在线 | 国产精彩视频 | 亚洲福利二区 | 日本国产高清色www视频在线 | 色婷婷久久综合中文久久一本` | 天天快乐在线观看 | 喜马拉雅听书免费版 | 精品国产成a人在线观看 | 国产99在线 | 欧美影院天天5g天天爽 | 四虎影视永久在线精品免费 | 国产成人看片免费视频观看 | 丝瓜秋葵番茄绿巨人在线观看 | 日本68xxxxxxxxx24 日本 片 成人 在线 | 日日本老女人 | 91一个人的在线观看www | 99国产精品免费视频 | 亚洲精品国产一区二区在线 | 亚洲高清中文字幕一区二区三区 | 青青草高清视频 | 亚洲精品国产一区二区三区在 | 双夫1v2| a∨79成人网 | 欧美日韩一区二区三区在线播放 | 高h全肉动漫在线观看免费 高h辣h双处全是肉军婚 | 无遮18禁在线永久免费观看挡 | 色综合久久综精品 | 扒开腿开嫩苞 | 久久综合给会久久狠狠狠 | 激情亚洲天堂 | 国产亚洲精aa在线观看不卡 | www.色婷婷.com| 91视频破解版 | 日韩风月片 | 欧美人妖草草xxoo | 欧美无专区 |