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

盤點(diǎn)分析C語言中少見卻強(qiáng)大的字符串函數(shù)

 更新時間:2022年02月14日 11:15:01   作者:喬  
這篇文章主要為大家盤點(diǎn)及分析C語言中少見卻強(qiáng)大的字符串函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

正片開始

字符串函數(shù)

首先神魔是字符串函數(shù)?

指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計算長度,字符查找等的函數(shù)。 功能:把src所指由NUL結(jié)束的字符串復(fù)制到dest所指的 數(shù)組 中。 返回指向dest結(jié)尾處字符 (NUL)的 指針 。

像之前我寫到過的 strcpy,strcat,strcmp 這些函數(shù)都屬于長度不受限的字符串函數(shù),由此就有下面兩種分類

1.長度不受限的字符串函數(shù)

2.長度受限的字符串函數(shù)

長度不受限就是以‘ \0 ’為函數(shù)結(jié)束標(biāo)準(zhǔn)的判定,當(dāng)對象沒給定 ’ \0 '時,就跑不出結(jié)果或者報錯;相反則為長度受限。我再整理一下,好做個對比:

strcpy

字符串拷貝,把指向的字符串復(fù)制到目標(biāo)字符串,聲明為

char *strcpy(char *dest, const char *src)

strcat

字符串連續(xù),把指向的字符串追加到目標(biāo)字符串的結(jié)尾(無間隔),聲明為:

char *strcat(char *dest, const char *src)

strcmp

把所指向的字符串和目標(biāo)字符串進(jìn)行比較, 返回值大小決定二者的相對大小,聲明如下:

int strcmp(const char *str1, const char *str2)

以上三種是函數(shù)的長度受限,我們可以變 strncpy,strncat 和 strncmp,就是長度不受限函數(shù)了,相比多了一個 n ,這個 n 是指函數(shù)作用范圍最多在前 n 個字節(jié),比如 strncmp 中的n 就是要比較的最大字符數(shù),就相當(dāng)于一個限制機(jī)制了。

這里主要補(bǔ)充幾個比較實(shí)用的吧:

strstr

其實(shí)顧名思義,翻譯過來就是“字符串字符串”,其實(shí)作用就是在一個字符串里面找我的目標(biāo)字符串,不包含終止符 ‘\0’,返回值是該函數(shù)在 目標(biāo)字符串中第一次出現(xiàn)該字符串的位置。聲明為:

char *strstr(const char *haystack, const char *needle)

舉個栗子:

int main()
{
	char a[] = "overwatch";
	char b[] = "wa";
	char* c = strstr(a, b);
	if (c != NULL)
	{
		printf("found it: %s\n", c);
	}
	else
	{
		printf("there was nothing\n");
	}
	return 0;
}

在這里插入圖片描述

我們用最常規(guī)的代碼也可以模擬出 strstr 的功能,庫函數(shù)的實(shí)現(xiàn)方法也是類似

#include<assert.h>
char* strstr1(const char* a, const char* b)
{
	assert(a && b);
	const char* c = NULL;
	const char* d = NULL;
	const char* str = a;
	if (*b == '\0')
	{
		return (char*)a; //處理查找語句為空語句
	}
	while (*str)
	{
		c = str;
		d = b;
		while (*c && *d && (*c == *d))//防止相同元素為'\0' 循環(huán)繼續(xù)導(dǎo)致越界訪問
		{
			*c++;
			*d++;
		}
		if (*d == '\0')
		{
			return (char*)str;
		}
		str++;//多次查找,匹配錯誤會回到起點(diǎn)++再重新查找
	}
	return NULL;
}

在這里插入圖片描述

要注意的是,該函數(shù)規(guī)定當(dāng)查找對象字符串為空 (\0) 時,會返回目標(biāo)字符串的地址。

KMP算法

說到了 strstr ,引申一下KMP算法,也就是字符串查找算法,稱之為 Knuth-Morria-Pratt 算法。該算法相對于暴力算法有比較大的改進(jìn),主要是消除了主串指針的回溯,從而使算法效率有了某種程度的提高。KMP算法比我們的 strstr 效率要高,我們?nèi)蘸笤偌?xì)細(xì)講解

strtok

我們可以稱之為字符串刀,作用就是分割字符串,strtok() 函數(shù)的聲明如下:

char *strtok(char *str, const char *delim)

str 為一組字符串,delim 為分隔符,也可以是個集合,分割結(jié)果變成第一個子字符串。

因?yàn)榻Y(jié)果被修改所以 strtok 對象一般為臨時拷貝的可修改內(nèi)容。舉個栗子:

int main()
{
	char a[] = "overwatch";
	char b[20] = { 0 };
	char* ret = NULL;
	strcpy(b, a); //進(jìn)行臨時拷貝方便切割
	char* p = "w";//指針類型維護(hù)分隔符
	ret = strtok(b, p);
	printf("%s\n", ret);
	return 0;
}

在這里插入圖片描述

若要進(jìn)一步分割,我們需要空指針進(jìn)行維護(hù),什么意思?
分割完一次,結(jié)尾就會變成 ‘ \0 ’,此時的 strtok 記憶能力已經(jīng)記住了 ‘ \0 ’的位置,這個記憶功能我們大致都能猜出是一個靜態(tài)變量,static 修飾一個局部變量時就可以做到這點(diǎn),就是我們只需要傳入一個 null ,就可以自動進(jìn)行分割,以此類推:

	strtok(b, p);
	ret = strtok(NULL,"t");

在這里插入圖片描述

strerror

咱在使用庫函數(shù)時,總會有調(diào)用失敗的時候,這時候都會有一個錯誤碼被設(shè)置,這個錯碼都會放進(jìn) errno 這個全局錯誤碼里面,我們看到的錯誤信息可能是一個莫名其妙的數(shù)字,而 strerror 就是將錯誤碼翻譯成錯誤信息,并返回一個指向錯誤消息字符串的指針。strerror 生成的錯誤字符串取決于開發(fā)平臺和編譯器。

char *strerror(int errnum)

比如:

int main()
{
	printf("%s\n", strerror(10));
	printf("%s\n", strerror(20));
	printf("%s\n", strerror(30));
	return 0;
}

在這里插入圖片描述

結(jié)果分別是:無子進(jìn)程,非目錄元素,只讀文件系統(tǒng)

但其實(shí) strerror 并不是小題大做拿來查詢錯誤的,是在文本上輸入輸出時方便我們得知打開寫入打開失敗的原因的,當(dāng)我們嘗試打開一個不存在的文件時就會報錯: No such file or directory

#include <errno.h>
int main ()
{
   FILE *fp;  fp = fopen("file.txt","search");
   if( fp == NULL ) 
   {
      printf("Error: %s\n", strerror(errno));
   }  
  return(0);
}

因?yàn)槲覀円{(diào)用C語言給出的全局變量 errno,所以記得要引 <errno.h> 頭文件。

以上就是盤點(diǎn)分析C語言中少見卻強(qiáng)大的字符串函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C語言字符串函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言中const和define的區(qū)別你了解嘛

    C語言中const和define的區(qū)別你了解嘛

    這篇文章主要為大家詳細(xì)介紹了C語言中const和define的區(qū)別,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 使用C++實(shí)現(xiàn)鏈表元素的反轉(zhuǎn)

    使用C++實(shí)現(xiàn)鏈表元素的反轉(zhuǎn)

    反轉(zhuǎn)鏈表是鏈表操作中一個經(jīng)典的問題,也是面試中常見的考題,本文將從思路到實(shí)現(xiàn)一步步地講解如何實(shí)現(xiàn)鏈表的反轉(zhuǎn),幫助初學(xué)者理解這一操作,我們將使用C++代碼演示具體實(shí)現(xiàn),同時分析時間復(fù)雜度和空間復(fù)雜度,需要的朋友可以參考下
    2025-02-02
  • C++中md5 算法實(shí)現(xiàn)代碼

    C++中md5 算法實(shí)現(xiàn)代碼

    在網(wǎng)上找了份c++ MD5的代碼,就簡單保存一下,需要的朋友可以參考下
    2017-07-07
  • C++超詳細(xì)講解函數(shù)參數(shù)的默認(rèn)值

    C++超詳細(xì)講解函數(shù)參數(shù)的默認(rèn)值

    在C++中,定義函數(shù)時可以給形參指定一個默認(rèn)的值,這樣調(diào)用函數(shù)時如果沒有給這個形參賦值(沒有對應(yīng)的實(shí)參),那么就使用這個默認(rèn)的值。也就是說,調(diào)用函數(shù)時可以省略有默認(rèn)值的參數(shù)
    2022-05-05
  • 深入解析C中的數(shù)值與真假

    深入解析C中的數(shù)值與真假

    本篇文章是對C中數(shù)值與真假進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言編寫五子棋游戲

    C語言編寫五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語言編寫五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • C++類與對象的詳細(xì)說明2

    C++類與對象的詳細(xì)說明2

    這篇文章主要為大家詳細(xì)介紹了C++的類與對象,使用數(shù)據(jù)庫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C語言 指針數(shù)組詳解及示例代碼

    C語言 指針數(shù)組詳解及示例代碼

    本文主要介紹C語言 指針數(shù)組,這里提供詳細(xì)的資料和簡單示例代碼以便大家學(xué)習(xí)參考,有需要學(xué)習(xí)的小伙伴可以參考下
    2016-08-08
  • C++面試題之結(jié)構(gòu)體內(nèi)存對齊計算問題總結(jié)大全

    C++面試題之結(jié)構(gòu)體內(nèi)存對齊計算問題總結(jié)大全

    這篇文章主要給大家總結(jié)了關(guān)于C++面試題中結(jié)構(gòu)體內(nèi)存對齊計算問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),通過這些介紹的內(nèi)容對大家在面試C++工作的時候,會有一定的參考幫助,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • C語言線性表之雙鏈表詳解

    C語言線性表之雙鏈表詳解

    這篇文章主要為大家詳細(xì)介紹了C語言線性表之雙鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02

最新評論

屯昌县| 永平县| 农安县| 莱阳市| 张家川| 苏州市| 洞口县| 桐庐县| 通化市| 饶河县| 海伦市| 贡嘎县| 随州市| 修武县| 苍梧县| 安龙县| 封丘县| 阜宁县| 乌拉特前旗| 泸定县| 云和县| 山阳县| 上犹县| 凤阳县| 云南省| 徐汇区| 泸定县| 南宫市| 永兴县| 舒兰市| 云浮市| 浙江省| 博兴县| 河曲县| 遂昌县| 崇阳县| 循化| 侯马市| 龙川县| 额济纳旗| 临澧县|