日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言進階之字符串查找庫函數詳解_C 語言

作者:工業廢氣 ? 更新時間: 2023-03-16 編程語言

strstr

查找strstr的文檔,可知它的原型為:

char *strstr( const char *string, const char *strCharSet );

它的返回值,根據文檔是這樣的:?

Return Value

Each of these functions returns a pointer to the first occurrence of strCharSet in string, or NULL if strCharSet does not appear in string. If strCharSet points to a string of zero length, the function returns string.

可知會返回一個指針,指向目標字符串在strCharSet中第一次出現的位置。如果沒有,就返回一個空指針。

簡單地說,就是查找子字符串。

由于返回值是指針,那么接收返回值就要用指針類型來接收。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[] = "abbbcdbbcef";
	char arr2[] = "bbc";
	char* ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

輸出結果如下:

如果我把arr2改成bbcq,那么在arr1中找不到arr2,就會返回空指針:

現在來模擬實現strstr。

分為兩種情況。

情況1:

這種情況較為簡單,arr1首先指向a,arr2指向b,a和b不相等,那么arr1指向下一個字符,此時arr2仍指向b,此時arr1和arr2指向的字符相等,那么arr2指向下一個字符,arr1也指向下一個字符,發現arr1和arr2指向的字符相等,那么arr2指向下一個字符,這時指向了\0,就停止了查找。

情況2:

arr1最開始指向a,arr2最開始指向b。

arr1和arr2所指向的字符不相等,那么arr1就指向下一個字符,arr2仍指向第一個b,此時arr1和arr2指向的字符相等,那么arr2指向下一個字符,arr1也指向下一個字符,發現arr1和arr2指向的字符相等,那么arr1和arr2繼續指向下一個字符,此時arr1和arr2分別所指向的字符不相等,而此時arr2也不能向前指了,那么就停止了查找。

顯而易見,這是有問題的!問題就在于第一個字符串里明明有第二個字符串的存在,卻沒有查找到。

正確的做法是,arr1指向出現的第二個b,arr2指向第一個字符,然后重新查找。

那么此時就需要有一些臨時變量,不要用arr1和arr2親自查找。

可以這樣來實現模擬strstr:

#include <string.h>
#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	if (*str2 == '\0')//用于判斷srr2是不是空字符串
	{
		return (char*)str1;
	}
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cp = str1;
	while (*cp)//當*cp為0時終止循環
	{
		s1 = cp;
		s2 = str2;//內循環每次開始前s2都指向要查找的字符串首元素,s1指向被查找的字符串里下一個字符
		while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
		{
			s1++;
			s2++;//只要字符串不結束并且指向的字符相等就循環
		}
		if (*s2 == '\0')//如果條件成立,說明找到了子字符串
		{
			return (char*)cp;
		}
		cp++;
	}
	return NULL;
}

strtok

這個函數不管是使用還是原理,都相當獨特。其原型如下:

char *strtok( char *strToken, const char *strDelimit );

sep參數是個字符串,定義了用作分隔符的字符集合。

第一個參數指定一個字符串,它包含了0個或者多個由sep字符串中一個或者多個分隔符分割的標
記。

strtok函數找到str中的下一個標記,并將其用 \0 結尾,返回一個指向這個標記的指針。(注:strtok函數會改變被其操作的字符串,所以在使用strtok函數切分的字符串一般都是臨時拷貝的內容并且可修改。)

strtok函數的第一個參數不為 NULL ,函數將找到str中第一個標記,strtok函數將保存它在字符串
中的位置。

strtok函數的第一個參數為 NULL ,函數將在同一個字符串中被保存的位置開始,查找下一個標
記。

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

字符串superverybest@outlooks.net是由@和.切開的,@和.其實就是分隔符。那么要將superverybest、outlooks、net分隔開,可以這樣:

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "superverybest@outlooks.net";
	char* p = "@.";
	char buf[50] = { 0 };
	strcpy(buf, arr);
	char* ret = NULL;
	for (ret = strtok(buf, p); ret != NULL; ret=strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

輸出結果為:

總結

原文鏈接:https://blog.csdn.net/m0_60464690/article/details/128703024

欄目分類
最近更新