国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二)

這篇具有很好參考價(jià)值的文章主要介紹了【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

strcat的介紹及實(shí)現(xiàn)

strcat的作用就是字符串追加,即將一個(gè)字符串添加到另一個(gè)字符串末尾。
那既然要追加字符串,要怎么找到目標(biāo)字符串的末尾呢?所以這就要求目標(biāo)空間中要有'\0',找到'\0'就是找到末尾了。需要注意的是此函數(shù)內(nèi)部在找末尾時(shí),找的是目標(biāo)空間中第一個(gè)'\0'的位置,然后從此位置開始追加。又開始就要有結(jié)束,所以源字符串中也要有'\0'。既然要追加字符串,所以目標(biāo)空間必須可以被修改。
strcat將源字符串追加到目標(biāo)字符串末尾,那么目標(biāo)空間就必須足夠大。還有一點(diǎn)需要注意的是,此函數(shù)返回的是目標(biāo)空間首元素地址。
【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二),c語言學(xué)習(xí),c語言,開發(fā)語言
根據(jù)上面總結(jié)了以下幾點(diǎn):

  1. 目標(biāo)空間要有'\0',(開始追加的地方)
  2. 源頭字符串中要有'\0',(追加到此處結(jié)束)
  3. 目標(biāo)空間要足夠大可修改

實(shí)現(xiàn)方法如下:

#include<stdio.h>
#include<assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;//記錄目標(biāo)字符串首元素地址
	assert(dest && src);
	//1.找到目標(biāo)空間的'\0'
	while (*dest != '\0')
	{
		dest++;
	}
	//2.拷貝數(shù)據(jù)
	while (*dest++ = *src++)
	{
		;
	}
	//3.返回參數(shù)
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char* p = "world";
	printf("%s\n",my_strcat(arr1, p));
	return 0;
}

【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二),c語言學(xué)習(xí),c語言,開發(fā)語言
再來思考這么一個(gè)問題:如果用strcat自己給自己追加會發(fā)生什么,如下:

my_strlen(arr1,arr1);

仔細(xì)分析一下會發(fā)現(xiàn),當(dāng)找到目標(biāo)空間的'\0'時(shí),源字符串就會將此'\0'修改,那么在繼續(xù)追加字符時(shí),由于源字符串和目標(biāo)空間相同,且'\0'被修改,則此函數(shù)就無法結(jié)束,從而導(dǎo)致程序崩潰。

strcmp的介紹及實(shí)現(xiàn)

strcmp是比較兩個(gè)字符串的大小關(guān)系的函數(shù)。
關(guān)于比較規(guī)則:比較的是兩個(gè)字符串中對應(yīng)位置上的字符,一開始比較的則是兩個(gè)字符串的首元素所對應(yīng)的字典序。如果兩個(gè)所對應(yīng)的字典序不同,則會繼續(xù)比較,直到比較到兩個(gè)不同的字符或是找到了'\0'。如果比較的結(jié)果是:

  1. str1 > str2,則返回大于0的數(shù);
  2. str1 = str2,則會返回0,這里的相等是直至字符串末尾都相等;
  3. str1 < str2,則會返回小于0的數(shù)

關(guān)于函數(shù)參數(shù):strcmp返回值是一個(gè)整形,接收的參數(shù)是兩個(gè)字符串的地址,而此地址指向的地址是不可修改的,所以用const修飾。
【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二),c語言學(xué)習(xí),c語言,開發(fā)語言
模擬實(shí)現(xiàn)如下:

#include<stdio.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		//判斷字符串是否結(jié)束
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	//比較對應(yīng)值
	if (*str1 > *str2)
		return 1;
	else
		return -1;
	//此處也可以直接用兩值的差作為返回值
	//即:return *str1 - *str2;
}
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	return 0;
}

小結(jié)

通過上面介紹的strcat,strcmp這兩個(gè)函數(shù),及在 字符串函數(shù)的模擬實(shí)現(xiàn)中介紹的strcmp函數(shù),我們發(fā)現(xiàn)這些都是長度不受限制的字符串函數(shù)。因?yàn)檫@個(gè)特點(diǎn),所以我們在使用時(shí)存在一些安全性的問題,這就要求我們在使用時(shí)要格外的小心,防止發(fā)生包括但不限于越界訪問,死循環(huán)導(dǎo)致的程序崩潰等問題。
所以c語言也引入了如strncpy,strncat,strncmp等長度受限制的字符串函數(shù),下面我會對這些函數(shù)一一介紹。

strncpy的介紹及實(shí)現(xiàn)

strncpy就是拷貝num個(gè)字符從源字符串到目標(biāo)空間。
在使用時(shí)當(dāng)然還有一些細(xì)節(jié)要注意:

  1. 當(dāng)要拷貝的字符個(gè)數(shù)num大于源頭字符串的的長度時(shí),會在目標(biāo)空間繼續(xù)拷貝'\0'直至達(dá)到num個(gè);
  2. 如果num小于源字符串的話,strncpy并不會在目標(biāo)空間多拷貝一個(gè)'\0'表示結(jié)束;
  3. 相較于strcpy,strncpy多了一個(gè)參數(shù)類型為size_t的參數(shù),這就是需要拷貝的字符的個(gè)數(shù)。
    【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二),c語言學(xué)習(xí),c語言,開發(fā)語言

strncpy模擬實(shí)現(xiàn)圖解:
【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二),c語言學(xué)習(xí),c語言,開發(fā)語言

模擬實(shí)現(xiàn):文章來源地址http://www.zghlxwxcb.cn/news/detail-729429.html

#include<stdio.h>
#include<assert.h>

char* my_strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest && src);
	//拷貝源字符串中的字符到目標(biāo)空間,記錄剩下需要拷貝的字符,直到num為0或源字符串結(jié)束
	while (num && (*dest++ = *src++))
		num--;
	//判斷拷貝是否結(jié)束,如果沒有繼續(xù)拷貝num個(gè)'\0'
	if (num)
		while (--num)
			*dest++ = '\0';
	return ret;
}
int main()
{
	char arr1[20] = "hello world";
	char arr2[] = "love";
	printf("%s\n", my_strncpy(arr1, arr2, 4));
	return 0;
}

到了這里,關(guān)于【c語言】字符串函數(shù)的模擬實(shí)現(xiàn)(二)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C語言:字符函數(shù)和字符串函數(shù)詳解及部分函數(shù)的模擬實(shí)現(xiàn)(前篇)

    C語言:字符函數(shù)和字符串函數(shù)詳解及部分函數(shù)的模擬實(shí)現(xiàn)(前篇)

    前言: C語言中對 字符和字符串 的處理很是頻繁,但是C語言本身是沒有字符串類型的, 字符串通常放在 常量字符串 中或者 字符數(shù)組 中。 字符串常量 適用于那些對它不做修改的字符串函數(shù)。 本篇文章將會 重點(diǎn)介紹處理字符和字符串的庫函數(shù)的使用和注意事項(xiàng)。 strlen函數(shù)

    2024年02月06日
    瀏覽(34)
  • 【C語言】——字符串函數(shù)的使用與模擬實(shí)現(xiàn)(上)

    【C語言】——字符串函數(shù)的使用與模擬實(shí)現(xiàn)(上)

    ??在我們學(xué)習(xí) C語言 的過程中,對 庫函數(shù) 的使用是必不可少的。其中,相信大家最熟悉的就是 s t d i o . h stdio.h s t d i o . h 中的 p r i n t print p r in t 和 s c a n f scanf sc an f 函數(shù)了吧。 ??但是今天,我們不講他們(太難了,嗚嗚嗚),今天我們來講與字符串相關(guān)的函數(shù),也就

    2024年04月26日
    瀏覽(25)
  • 【我愛C語言】詳解字符函數(shù)isdigit和字符串轉(zhuǎn)換函數(shù)(atoi和snprintf實(shí)現(xiàn)互相轉(zhuǎn)換字符串)&&三種strlen模擬實(shí)現(xiàn)

    【我愛C語言】詳解字符函數(shù)isdigit和字符串轉(zhuǎn)換函數(shù)(atoi和snprintf實(shí)現(xiàn)互相轉(zhuǎn)換字符串)&&三種strlen模擬實(shí)現(xiàn)

    ??個(gè)人主頁 : @啊森要自信的主頁 ?? 真正相信奇跡的家伙,本身和奇跡一樣了不起?。?歡迎大家關(guān)注??點(diǎn)贊??收藏??留言??希望看完我的文章對你有小小的幫助,如有錯(cuò)誤,可以指出,讓我們一起探討學(xué)習(xí)交流,一起加油鴨。 本小節(jié)我們將學(xué)習(xí)字符分類函數(shù),字符

    2024年02月04日
    瀏覽(33)
  • C語言:字符串函數(shù)的使用方法及模擬實(shí)現(xiàn)

    C語言:字符串函數(shù)的使用方法及模擬實(shí)現(xiàn)

    方法一:計(jì)數(shù)器方式 方法二:指針-指針 1.1 strcpy只用于字符串復(fù)制,遇到‘\\0’時(shí)停止,還會復(fù)制字符串的結(jié)束符\\\'\\0\\\'; 所以源字符串必須 ? ? ? ? 以’\\0’結(jié)束,也會將源字符串的’\\0’拷貝到目標(biāo)空間。 1.2 目標(biāo)空間必須可變。 1.3 如果參數(shù)dest所指的內(nèi)存空間不夠大,可能

    2024年04月25日
    瀏覽(22)
  • C語言學(xué)習(xí)NO.13-字符函數(shù)(三)-strncpy,strncat,strncmp長度受限制的字符串函數(shù)

    C語言學(xué)習(xí)NO.13-字符函數(shù)(三)-strncpy,strncat,strncmp長度受限制的字符串函數(shù)

    ?使用時(shí)需要包含頭文件string.h ? 將源字符串的前num個(gè)字符復(fù)制到目標(biāo)。如果源C字符串的末尾在復(fù)制num個(gè)字符之前找到\\\'\\0\\\',剩下自動記0,直到總共寫入了num個(gè)字符。 ?拷貝num個(gè)字符從源字符串到目標(biāo)空間。 ?如果源字符串的長度小于num,則拷貝完源字符串之后,在目標(biāo)的

    2024年01月24日
    瀏覽(92)
  • c語言進(jìn)階部分詳解(詳細(xì)解析字符串常用函數(shù),并進(jìn)行模擬實(shí)現(xiàn)(下))

    c語言進(jìn)階部分詳解(詳細(xì)解析字符串常用函數(shù),并進(jìn)行模擬實(shí)現(xiàn)(下))

    上篇文章介紹了一些常用的字符串函數(shù),大家可以跳轉(zhuǎn)過去瀏覽一下:c語言進(jìn)階部分詳解(詳細(xì)解析字符串常用函數(shù),并進(jìn)行模擬實(shí)現(xiàn)(上))_總之就是非常唔姆的博客-CSDN博客 今天接著來介紹一些:? 目錄 一.字符串查找 1.strstr() 1.1示例 1.2注意事項(xiàng): 1.3模擬實(shí)現(xiàn) ?2.

    2024年02月07日
    瀏覽(20)
  • 【C語言】字符串函數(shù)strcpy&&strcat&&strcmp&&strstr的使?和模擬實(shí)現(xiàn)

    【C語言】字符串函數(shù)strcpy&&strcat&&strcmp&&strstr的使?和模擬實(shí)現(xiàn)

    ??個(gè)人主頁 : @啊森要自信的主頁 ?? 真正相信奇跡的家伙,本身和奇跡一樣了不起?。?歡迎大家關(guān)注??點(diǎn)贊??收藏??留言??希望看完我的文章對你有小小的幫助,如有錯(cuò)誤,可以指出,讓我們一起探討學(xué)習(xí)交流,一起加油鴨。 記上節(jié),我們學(xué)了字符串 strlen 的使用和

    2024年02月05日
    瀏覽(21)
  • 字符函數(shù)和字符串函數(shù)的模擬實(shí)現(xiàn)

    字符函數(shù)和字符串函數(shù)的模擬實(shí)現(xiàn)

    求字符串長度 strlen ?長度不受限制的字符串函數(shù) strcpy strcmp strcat 長度受限制的字符串函數(shù) strnlen strncmp strncpy strncat 字符串查找 strstr strtok 錯(cuò)誤信息報(bào)告 strerror 內(nèi)存操作函數(shù) memcpy memmove memset memcmp ?首先我們來看strlen 字符串是以‘\\0’為結(jié)束標(biāo)志,strlen函數(shù)返回的是‘\\0’出現(xiàn)

    2024年02月13日
    瀏覽(23)
  • 字符函數(shù)和字符串函數(shù)解析及模擬實(shí)現(xiàn)

    字符函數(shù)和字符串函數(shù)解析及模擬實(shí)現(xiàn)

    字符串以’\\0’作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中’\\0’前面出現(xiàn)過的字符個(gè)數(shù)(不包括’\\0’)。 參數(shù)指向的字符串必須以’\\0’結(jié)束。 注意函數(shù)的返回值位size_t, 是無符號的 。 Copies the C string pointed by source into the array pointed by destination, including the terminating null c

    2024年02月16日
    瀏覽(19)
  • 字符和字符串的庫函數(shù)模擬與實(shí)現(xiàn)

    字符和字符串的庫函數(shù)模擬與實(shí)現(xiàn)

    前言: 相信大家平常在寫代碼的時(shí)候,用代碼解決實(shí)際問題時(shí)苦于某種功能的實(shí)現(xiàn),而望而止步,這個(gè)時(shí)候庫函數(shù)的好處就體現(xiàn)出來了,當(dāng)然個(gè)人代碼編寫能力強(qiáng)的可以自己創(chuàng)建一個(gè)函數(shù),不過相當(dāng)于庫函數(shù)來說卻是浪費(fèi)了一點(diǎn)時(shí)間,庫函數(shù)的準(zhǔn)確性和有效性對我們的好處就

    2024年02月10日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包