最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

帶你用C語(yǔ)言實(shí)現(xiàn)strtok和字符串分割函數(shù)

 更新時(shí)間:2021年09月14日 11:52:38   作者:^jhao^  
下面小編就為大家?guī)?lái)一篇c語(yǔ)言中字符串分割函數(shù)及實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

前言

字符串分割函數(shù)strtok,大家可能都知道他怎么使用,一旦要用的時(shí)候就會(huì)心生疑惑,不知道它的內(nèi)部的實(shí)現(xiàn),廢話不多說(shuō),本篇就來(lái)帶大家看看strtok的基本使用和實(shí)現(xiàn)

一、strtok的基本使用

在這里插入圖片描述

解析:函數(shù)大概說(shuō)了以下幾點(diǎn)

1.str就是我們要去拆分的字符串,注意,我們會(huì)對(duì)該字符串進(jìn)行更改,所以一般我們會(huì)拷貝一份然后去分割拷貝的那份字符串?。?br />

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

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

4.strtok函數(shù)的第一個(gè)參數(shù)為 NULL ,函數(shù)將在同一個(gè)字符串中被保存的位置(即上面所說(shuō)的位置w)開(kāi)始,查找下一個(gè)標(biāo)記。

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

分析完后我們看一段代碼,對(duì)一段字符串做一個(gè)切割

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;
}

在這里插入圖片描述

二、strtok的實(shí)現(xiàn)

分析:進(jìn)來(lái)的情況大致分為兩種,str為空和不為空的情況,函數(shù)第一次調(diào)用的話因?yàn)槲覀円涗浵乱淮芜M(jìn)來(lái)時(shí)的位置,我們選擇在函數(shù)內(nèi)部創(chuàng)建一個(gè)static的靜態(tài)變量,static char* p_last = NULL ,并且第一次我們?cè)O(shè)置為NULL,函數(shù)又分為兩種情況,我們切割的話用tmp指針往后走,str指針保存當(dāng)前位置,所以tmp指針走到\0時(shí)我們還要將p_last處理成NULL,其他的情況(str串還能被delimiters分隔)我們就在函數(shù)內(nèi)部把*tmp = ‘\0',再將p_last處理為下一次進(jìn)來(lái)的位置即可。

例子:

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;
}

第一次分割

在這里插入圖片描述

第二次分割

在這里插入圖片描述

第三次分割

在這里插入圖片描述

第四次切割

在這里插入圖片描述

實(shí)現(xiàn)代碼如下,有需要自?。?/strong>

char* my_strtok(char* str, char* delimiters)
{
	//str傳NULL的時(shí)候如果上次有記錄,則用上一次的下一個(gè)位置,不然就為NULL
    static char* p_last = NULL;
	if (str == NULL && p_last == NULL)
		return NULL;
	if (str == NULL)
	{
		//用來(lái)返回的當(dāng)前位置
		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;
				}
			}
			//走到這里表示當(dāng)前的tmp沒(méi)有在delimiters中能找到的
			tmp++;
		}
		//走到這里就是自己走到斜杠\0的位置,就要將p_last 設(shè)置成為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;
				}
			}
			//走到這里表示當(dāng)前的tmp沒(méi)有在delimiters中能找到的
			tmp++;
		}
		//找到了,找不到
		char* ret = p_last;
		p_last = NULL;
		return ret;
	}
}

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì)

    C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)宿舍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • ??C++11系列學(xué)習(xí)之Lambda表達(dá)式

    ??C++11系列學(xué)習(xí)之Lambda表達(dá)式

    這篇文章主要介紹了??C++11系列學(xué)習(xí)之Lambda表達(dá)式,C++11終于也引入了lambda表達(dá)式,lambda最早來(lái)源于函數(shù)式編程,現(xiàn)代語(yǔ)言慢慢都引入了這個(gè)語(yǔ)法,下文關(guān)于??C++11Lambda表達(dá)式相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • opencv3/C++視頻中疊加透明圖片的實(shí)現(xiàn)

    opencv3/C++視頻中疊加透明圖片的實(shí)現(xiàn)

    今天小編就為大家分享一篇opencv3/C++視頻中疊加透明圖片的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C++迷宮問(wèn)題的求解算法

    C++迷宮問(wèn)題的求解算法

    這篇文章主要為大家詳細(xì)介紹了C++迷宮問(wèn)題的求解算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++淺析內(nèi)存分區(qū)模型概念與示例

    C++淺析內(nèi)存分區(qū)模型概念與示例

    在了解內(nèi)存分區(qū)之前,我們先來(lái)聊一聊為什么要進(jìn)行內(nèi)存分區(qū)。在進(jìn)行了內(nèi)存分區(qū)之后,在不同的區(qū)域存放的數(shù)據(jù),會(huì)有不同的生命周期,從而會(huì)讓程序員的編程變得更加靈活
    2022-09-09
  • C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析

    C++ 中的new 和 delete 運(yùn)算符及new和malloc的區(qū)別解析

    在C++中,又引出了一個(gè)新玩法:new 和 delete,在C++中,new是用來(lái)動(dòng)態(tài)開(kāi)辟內(nèi)存的,delete是用來(lái)釋放我們所動(dòng)態(tài)開(kāi)辟的內(nèi)存C++中的new和delete運(yùn)算符及new和malloc的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 用C語(yǔ)言判斷字符是否為空白字符或特殊字符的方法

    用C語(yǔ)言判斷字符是否為空白字符或特殊字符的方法

    這篇文章主要介紹了用C語(yǔ)言判斷字符是否為空白字符或特殊字符的方法,分別為isspace()函數(shù)的使用和ispunct()函數(shù)的使用,需要的朋友可以參考下
    2015-08-08
  • C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)

    C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn)

    C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了C++ 將字符串值賦給CHAR數(shù)組的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 淺析C語(yǔ)言初階的常量和變量

    淺析C語(yǔ)言初階的常量和變量

    在C程序執(zhí)行過(guò)程中,其值不發(fā)生改變的量稱為常量,其值可變的量稱為變量,本文將帶你了解什么是常量和變量,以及使用方法,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

鹿邑县| 五大连池市| 楚雄市| 织金县| 瓦房店市| 广丰县| 永兴县| 衡山县| 罗山县| 偏关县| 航空| 本溪市| 淮滨县| 锡林郭勒盟| 黄陵县| 丹棱县| 沁水县| 庆阳市| 交城县| 泸定县| 个旧市| 饶阳县| 藁城市| 金堂县| 博客| 大港区| 天全县| 泰来县| 桑日县| 常熟市| 麻栗坡县| 兖州市| 安陆市| 夏津县| 邹平县| 玛纳斯县| 万全县| 夏邑县| 台北市| 甘泉县| 屏边|