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

C語(yǔ)言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實(shí)現(xiàn)

 更新時(shí)間:2022年05月07日 16:35:37   作者:菜菜不恰菜  
這篇文章主要介紹了怎樣用C語(yǔ)言模擬實(shí)現(xiàn)strcpy與strcat和strcmp函數(shù),strcpy()函數(shù)是C語(yǔ)言中的一個(gè)復(fù)制字符串的庫(kù)函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接,strcmp()函數(shù)作用是比較字符串str1和str2是否相同

一、模擬實(shí)現(xiàn)strcpy函數(shù)

strcpy函數(shù)是字符串拷貝函數(shù),就是將源字符串拷貝到目標(biāo)空間中。

char * strcpy ( char * destination, const char * source );//庫(kù)函數(shù)中的聲明

將源(source)指向的c字符串復(fù)制到目標(biāo)(destination)指向的數(shù)組中,包括終止的空字符(并在該點(diǎn)停止)。

為避免溢出,目標(biāo)(destination)指向的數(shù)組的大小應(yīng)足夠長(zhǎng),以包含與源相同的C字符串(包括終止的空字符),并且在內(nèi)存中不應(yīng)與源重疊。

在這里需要注意:

1、源字符串必須以 '\0' 結(jié)束。

2、會(huì)將源字符串中的 '\0' 拷貝到目標(biāo)空間。

3、目標(biāo)空間必須足夠大,以確保能存放源字符串。

4、目標(biāo)空間必須可變。

下面就用my_strcpy來(lái)模擬實(shí)現(xiàn)stcpy函數(shù)。

#include <stdio.h>
#include <assert.h>//assert的頭文件
char* my_strcpy(char* dest,const char* src)//這里用const修飾所指向的源字符串,因?yàn)樵醋址?
                                           //常量字符串,不能被修改
{
    char* ret = dest;
	assert(dest);//斷言源字符串和目標(biāo)空間都不能為空指針
	assert(src);
	while (*dest++ = *src++)//一個(gè)字符串一個(gè)字符串的拷貝,遇到'\0'結(jié)束
	{
		;
	}
   return ret;//返回目標(biāo)空間的起始地址
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
	printf("%s", my_strcnpy(arr1, arr2));
	return 0;
}

以上是整個(gè)字符串的拷貝,如果我們不拷貝整個(gè)字符串,只拷貝字符串里面的幾個(gè)字符,我們可以怎么做呢?接下來(lái)我們來(lái)看看strncpy這個(gè)函數(shù),這個(gè)函數(shù)可以實(shí)現(xiàn)只拷貝字符串里面的幾個(gè)字符。這個(gè)函數(shù)的模擬實(shí)現(xiàn)大體上跟strcpy函數(shù)是一樣的,只是這里有了長(zhǎng)度限制,接下來(lái)用my_strncpy來(lái)模擬實(shí)現(xiàn)。

#include <stdio.h>
#include <assert.h>
char* my_strcnpy(char* dest, const char* src, size_t n)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	int i = 0;
	for (i = 0; i < n; i++)//要拷貝幾個(gè)字符,循環(huán)幾次
	{
		*dest++ = *src++;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
	printf("%s", my_strcnpy(arr1, arr2, 3));//3就是我們要拷貝的字符串的大小,這里就相當(dāng)于將前三個(gè)字符hel進(jìn)行拷貝(這里也可以將整個(gè)字符串拷貝,只要知道大?。?
	return 0;
}

二、模擬實(shí)現(xiàn)strcat函數(shù)

strcat是連接字符串函數(shù),它的作用是將源字符串附加到目標(biāo)字符串。目標(biāo)中終止的空字符被源字符串中的第一個(gè)字符覆蓋,空字符包含在由目標(biāo)中的兩個(gè)字符串聯(lián)而成的新字符串的末尾。

char * strcat ( char * destination, const char * source );//庫(kù)函數(shù)中的聲明

在這里需要注意:

1、源字符串必須以 '\0' 結(jié)束,目的地也必須以 '\0' 結(jié)束

2、目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。

3、目標(biāo)空間必須可修改。

下面就用my_strcat來(lái)模擬實(shí)現(xiàn)strcat函數(shù)。

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)這里用const修飾所指向的源字符串,因?yàn)樵醋址?
                                           //常量字符串,不能被修改
{
	char* ret = dest;
	assert(dest);
	assert(src);
	while (*dest != '\0')\\找到目標(biāo)空間的結(jié)束標(biāo)志處,然后開(kāi)始連接
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		;
	}
	return ret;//返回目標(biāo)空間的起始地址
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	printf("%s\n", my_strncat(arr1, arr2));
	return 0;
}

對(duì)于字符串連接還有一個(gè)函數(shù)strncat也能描述,但是這個(gè)函數(shù)是有長(zhǎng)度限制的,可以連接一個(gè)字符串里面的幾個(gè)字符或者整個(gè)字符串。下面就用my_strncat來(lái)模擬實(shí)現(xiàn)strcat函數(shù)。

#include <stdio.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src,size_t n)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	int i = 0;
	while (*dest != '\0')\\找到目標(biāo)空間的結(jié)束標(biāo)志處,然后開(kāi)始連接
	{
		dest++;
	}
	for (i = 0; i < n; i++)//要連接幾個(gè)字符,循環(huán)幾次
	{
		*dest++ = *src++;
	}
	return ret;//返回目標(biāo)空間的起始地址
}
int main()
{
	char arr1[20] = "abc";
	char arr2[] = "def";
	printf("%s\n", my_strncat(arr1, arr2, 2));//需要連接幾個(gè)字符串,就將它們的大小傳過(guò)去,這里這里的2就是字符串里面"de"的大小,將"de"兩個(gè)字符傳過(guò)去
	return 0;
}

三、模擬實(shí)現(xiàn)strcmp函數(shù)

strcmp是字符串比較函數(shù),比較兩個(gè)字符串str1和str2,此函數(shù)開(kāi)始比較每個(gè)字符串的第一個(gè)字符。如果它們彼此相等,則繼續(xù)往下比,直到字符不同或到達(dá)終止的空字符。

int strcmp ( const char * str1, const char * str2 );//庫(kù)函數(shù)中的聲明

第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字

第一個(gè)字符串等于第二個(gè)字符串,則返回0

第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字

下面用my_strcmp來(lái)模擬實(shí)現(xiàn)strcmp函數(shù):

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1);
	assert(str2);
	while (*str1 == *str2)//先看首字符如果這兩個(gè)字符是否相等,如果相等繼續(xù)往下比,不相等跳出去比較大小
	{
		if (*str1 == '\0')//判斷是否已經(jīng)比完了所有字符,如果已經(jīng)比完了返回0,說(shuō)明這兩個(gè)字符串相等
		{
			return 0;
		}
		else//如果沒(méi)有比完,繼續(xù)往下一個(gè)比
		{
			str1++;
			str2++;
		}
	} 
	//如果兩個(gè)字符不相等,那就比大小,返回大于0的數(shù)則說(shuō)明str1>str2,反之小于。
	return *str1 - *str2;
}
int main()
{
	char arr1[20] = "abcefg";
	char arr2[] = "efghij";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf("大于\n");
	}
	else if (ret < 0)
	{
		printf("小于\n");
	}
	else
	{
		printf("等于\n");
	}
	return 0;
}

有長(zhǎng)度限制的比較函數(shù)strncmp,下面用my_strncmp模擬實(shí)現(xiàn):

#include <stdio.h>
#include <assert.h>
int my_strncmp(const char* str1, const char* str2,int n)
{
	int i = 0;
	for (i = 0; i < n; i++)//需要比較幾個(gè)字符循環(huán)幾次
	{
		if (*(str1 + i) == *(str2 + i))//先看首字符如果這兩個(gè)字符是否相等,如果相等繼續(xù)往下比,不相等跳出去比較大小
		{
			if (*str1 == '\0')//判斷是否已經(jīng)比完了所有字符,如果已經(jīng)比完了返回0,說(shuō)明這兩個(gè)字符串相等
			{
				return 0;
			}
			else//如果沒(méi)有比完,繼續(xù)往下一個(gè)比
				str1++;
				str2++;
		}
//如果兩個(gè)字符不相等,那就比大小,返回大于0的數(shù)則說(shuō)明str1>str2,反之小于。
		return *str1-*str2;
	}
}
int main()
{
	char arr1[20] = "abcefg";
	char arr2[] = "efghij";
	int ret = my_strncmp(arr1, arr2,2);
	if (ret > 0)
	{
		printf("大于\n");
	}
	else if (ret < 0)
	{
		printf("小于\n");
	}
	else
	{
		printf("等于\n");
	}
	return 0;
}

四、小結(jié)

以上就是字符串的庫(kù)函數(shù)的模擬實(shí)現(xiàn)。主要講了一種是長(zhǎng)度不受限制的字符串函數(shù)(strcpy,strcat,strcmp),一種是長(zhǎng)度受限制(strncpy,strncat,strncmp)的字符串函數(shù)。

到此這篇關(guān)于C語(yǔ)言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言strcpy strcat strcmp內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼

    C語(yǔ)言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼

    本篇文章主要介紹了C語(yǔ)言模式實(shí)現(xiàn)C++繼承和多態(tài)的實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C語(yǔ)言遞歸實(shí)現(xiàn)掃雷游戲

    C語(yǔ)言遞歸實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言遞歸實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Opencv透視變換綜合實(shí)例詳解

    Opencv透視變換綜合實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Opencv透視變換綜合實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C++ 類(lèi)和對(duì)象基礎(chǔ)篇

    C++ 類(lèi)和對(duì)象基礎(chǔ)篇

    類(lèi)是創(chuàng)建對(duì)象的模板,一個(gè)類(lèi)可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類(lèi)類(lèi)型的一個(gè)變量;創(chuàng)建對(duì)象的過(guò)程也叫類(lèi)的實(shí)例化。每個(gè)對(duì)象都是類(lèi)的一個(gè)具體實(shí)例(Instance),擁有類(lèi)的成員變量和成員函數(shù)
    2020-01-01
  • C++11 lambda表達(dá)式在回調(diào)函數(shù)中的使用方式

    C++11 lambda表達(dá)式在回調(diào)函數(shù)中的使用方式

    這篇文章主要介紹了C++11 lambda表達(dá)式在回調(diào)函數(shù)中的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 帶你粗略了解C++中的深淺拷貝

    帶你粗略了解C++中的深淺拷貝

    這篇文章主要給大家介紹了關(guān)于c++中深淺拷貝以及寫(xiě)時(shí)拷貝實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語(yǔ)言中怎么在main函數(shù)開(kāi)始前執(zhí)行函數(shù)

    C語(yǔ)言中怎么在main函數(shù)開(kāi)始前執(zhí)行函數(shù)

    C語(yǔ)言中怎么在main函數(shù)開(kāi)始前執(zhí)行函數(shù)呢?下面小編就大家詳細(xì)的介紹一下。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-10-10
  • Cocos2d-x 3.x入門(mén)教程(一):基礎(chǔ)概念

    Cocos2d-x 3.x入門(mén)教程(一):基礎(chǔ)概念

    這篇文章主要介紹了Cocos2d-x 3.x入門(mén)教程(一):基礎(chǔ)概念,本文講解了Director、Scene、Layer、Sprite等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • C++用boost.signal實(shí)現(xiàn)多播委托

    C++用boost.signal實(shí)現(xiàn)多播委托

    這篇文章介紹了C++用boost.signal實(shí)現(xiàn)多播委托的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06

最新評(píng)論

遂昌县| 新化县| 清苑县| 宁波市| 缙云县| 巴林右旗| 景宁| 敦煌市| 涿州市| 当阳市| 太白县| 临猗县| 泗水县| 射洪县| 哈尔滨市| 汶上县| 石台县| 延长县| 乌拉特前旗| 大邑县| 庆阳市| 仲巴县| 綦江县| 贵定县| 改则县| 宜城市| 祁阳县| 大庆市| 东方市| 泸州市| 乌兰浩特市| 阳原县| 佛冈县| 德保县| 新巴尔虎右旗| 黄石市| 塔河县| 和硕县| 博罗县| 新巴尔虎右旗| 中江县|