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

String底層函數(shù)的實現(xiàn)方式詳解

 更新時間:2023年09月14日 14:47:15   作者:代碼大魔王?  
這篇文章主要介紹了String底層函數(shù)的實現(xiàn)方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

一、常見的String封裝函數(shù)

1. strcpy函數(shù)的實現(xiàn)

char *strcpy(char *dest, const char *src)
{
	char *tmp = dest;
	while ((*dest++ = *src++) != '\0')
		/* nothing */;
	return tmp;
}

注意:strcpy  函數(shù)的返回值類型為  char* ,即目標字符串的起始地址,主要有以下兩個原因:

  • 方便鏈式表達式:通過返回目標字符串的指針,可以方便地在連續(xù)的字符串操作函數(shù)中進行鏈式調(diào)用。比如可以將  strcpy  與其他字符串操作函數(shù)(如  strcat )連續(xù)使用,如  result = strcpy(dest, src1); result = strcat(result, src2); 。這樣可以在一行代碼中完成多個字符串拷貝和連接的操作。
  • 返回傳入的目標指針: strcpy  函數(shù)在內(nèi)部會修改目標字符串指針  dest  的值,使其指向復制后的字符串的結尾位置。通過返回目標字符串的起始地址,可以方便地獲取復制后的字符串,并進行后續(xù)的操作或驗證。

2. strncpy函數(shù)的實現(xiàn)

char *strncpy(char *dest, const char *src, size_t count)
{
	char *tmp = dest;
	while (count) {
		if ((*tmp = *src) != 0)
			src++;
		tmp++;
		count--;
	}
	return dest;
}

3. strcat函數(shù)的實現(xiàn)

char *strcat(char *dest, const char *src)
{
	char *tmp = dest;
	while (*dest)
		dest++;
	while ((*dest++ = *src++) != '\0')
		;
	return tmp;
}

4. strncat函數(shù)的實現(xiàn)

char *strncat(char *dest, const char *src, size_t count)
{
	char *tmp = dest;
	if (count) {
		while (*dest)
			dest++;
		while ((*dest++ = *src++) != 0) {
			if (--count == 0) {
				*dest = '\0';
				break;
			}
		}
	}
	return tmp;
}

5.  strcmp函數(shù)的實現(xiàn)

int strcmp(const char *cs, const char *ct)
{
	unsigned char c1, c2;
	while (1) {
		c1 = *cs++;
		c2 = *ct++;
		if (c1 != c2)
			return c1 < c2 ? -1 : 1;
		if (!c1)
			break;
	}
	return 0;
}

6.  strncmp函數(shù)的實現(xiàn)

int strncmp(const char *cs, const char *ct, size_t count)
{
	unsigned char c1, c2;
	while (count) {
		c1 = *cs++;
		c2 = *ct++;
		if (c1 != c2)
			return c1 < c2 ? -1 : 1;
		if (!c1)
			break;
		count--;
	}
	return 0;
}

7.  strlen函數(shù)的實現(xiàn)

size_t strlen(const char *s)
{
	const char *sc;
	for (sc = s; *sc != '\0'; ++sc)
		/* nothing */;
	return sc - s;
}

8.  strnlen函數(shù)的實現(xiàn)

size_t strnlen(const char *s, size_t count)
{
	const char *sc;
	for (sc = s; count-- && *sc != '\0'; ++sc)
		/* nothing */;
	return sc - s;
}

9.  memset函數(shù)的實現(xiàn)

void *memset(void *s, int c, size_t count)
{
	char *xs = s;
	while (count--)
		*xs++ = c;
	return s;
}

10.  memcpy函數(shù)的實現(xiàn)

void *memcpy(void *dest, const void *src, size_t count)
{
	char *tmp = dest;
	const char *s = src;
	while (count--)
		*tmp++ = *s++;
	return dest;
}

二、內(nèi)存重疊問題

memcpy函數(shù)將src的字節(jié)數(shù)復制到dest。如果源和目標重疊,這個函數(shù)不能確保重疊區(qū)域的原始源字節(jié)在被覆蓋之前被復制。

一. 高地址向低地址進行拷貝由于在虛擬地址空間中,??臻g的生長方向是高地址向低地址生長,首先采用這種方式。簡略的講就是源字符串中的字符從前往后向目標字符串按給定字節(jié)的大小依此進行拷貝。觀察上圖,可以得到兩個合理的區(qū)間即不會出現(xiàn)內(nèi)存覆蓋的區(qū)間。

(1)dest<=src

第一種情況dest=src,此時源字符串與目標字符串指針指向同一個位置,拷貝的過程相當自己給自己賦值,因此拷貝結束 后源字符串并沒有發(fā)生變化。

第二種情況dest < src,這樣的拷貝盡管會覆蓋src的內(nèi)容,出現(xiàn)了內(nèi)存重疊,但其可以完成內(nèi)存拷貝的功能,并沒有將錯誤的信息拷貝過來。

(2)dest>=src+n當dest>=src+n,無論如何都不會出現(xiàn)內(nèi)存重疊的問題。

二. 低地址向高地址拷貝

(3)src<dest<src+n (內(nèi)存重疊)為了避免出現(xiàn)這種情況,我們可以將src和dest都移動 n-1個位置,這樣我們就可以從地址值向高地址進行拷貝,這樣盡管也有可能目標字符串覆蓋源字符串的情況,但是定影可以得到一個正確的拷貝。

  • memove可以避免內(nèi)存拷貝時的重疊問題。
  • 實際上,memcpy只是memmove的一個子集。
  • memcpy比memmove的速度要快一些。
void *memmove(void *dest, const void *src, size_t count)
{
	char *tmp;
	const char *s;
	if (dest <= src) {
		tmp = dest;
		s = src;
		while (count--)
			*tmp++ = *s++;
	} else {
		tmp = dest;
		tmp += count;
		s = src;
		s += count;
		while (count--)
			*--tmp = *--s;
	}
	return dest;
}

到此這篇關于String底層函數(shù)的實現(xiàn)方式的文章就介紹到這了,更多相關String底層函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++中常量與指針的示例詳解

    C++中常量與指針的示例詳解

    在C++學習使用過程中,每個人都不可避免地使用指針,而且都或多或少的接觸過常量指針或指針常量,但是對這兩個的概念還是很容易搞糊涂的,所以這篇文章主要給大家介紹了關于C++中常量與指針的相關資料,需要的朋友可以參考下
    2021-06-06
  • C語言編程之三個方法實現(xiàn)strlen函數(shù)

    C語言編程之三個方法實現(xiàn)strlen函數(shù)

    本篇文章是C語言編程篇,主要為大家介紹C語言編程中實現(xiàn)strlen函數(shù)的三個方法講解,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • C與C++中結構體的區(qū)別

    C與C++中結構體的區(qū)別

    C中的結構體只涉及到數(shù)據(jù)結構,而不涉及到算法,也就是說在C中數(shù)據(jù)結構和算法是分離的,而到C++中一類或者一個結構體可以包含函數(shù)(這個函數(shù)在C++我們通常中稱為成員函數(shù)),C++中的結構體和類體現(xiàn)了數(shù)據(jù)結構和算法的結合
    2013-10-10
  • C++異步數(shù)據(jù)交換實現(xiàn)方法介紹

    C++異步數(shù)據(jù)交換實現(xiàn)方法介紹

    這篇文章主要介紹了C++異步數(shù)據(jù)交換實現(xiàn)方法,異步數(shù)據(jù)交換,除了阻塞函數(shù) send() 和 recv() 之外,Boost.MPI 還支持與成員函數(shù) isend() 和 irecv() 的異步數(shù)據(jù)交換
    2022-11-11
  • C++實現(xiàn)基于靜態(tài)數(shù)組的順序表

    C++實現(xiàn)基于靜態(tài)數(shù)組的順序表

    這篇文章主要介紹了C++實現(xiàn)基于靜態(tài)數(shù)組的順序表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Qt中常用對話框使用技巧及注意事項

    Qt中常用對話框使用技巧及注意事項

    Qt?為應用程序設計提供了一些常用的標準對話框,如打開文件對話框、選擇顏色對話框、信息提示和確認選擇對話框、標準輸入對話框等,這篇文章主要給大家介紹了關于Qt中常用對話框使用技巧及注意事項的相關資料,需要的朋友可以參考下
    2024-04-04
  • C語言數(shù)據(jù)結構中堆排序的分析總結

    C語言數(shù)據(jù)結構中堆排序的分析總結

    堆是計算機科學中一類特殊的數(shù)據(jù)結構的統(tǒng)稱,通常是一個可以被看做一棵完全二叉樹的數(shù)組對象。而堆排序是利用堆這種數(shù)據(jù)結構所設計的一種排序算法。本文將通過圖片詳細介紹堆排序,需要的可以參考一下
    2022-04-04
  • Qt中connect()函數(shù)及用法詳解

    Qt中connect()函數(shù)及用法詳解

    connect() 函數(shù)就是Qt 框架中用于將信號(SIGNAL)和槽(SLOT)關聯(lián)起來的核心函數(shù),本文給大家介紹Qt中connect()函數(shù),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • C語言函數(shù)棧幀解析

    C語言函數(shù)棧幀解析

    下面小編就為大家?guī)硪黄獪\談C語言函數(shù)調(diào)用參數(shù)壓棧的相關問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • C++ 二維(多維)vector添加一個空項問題

    C++ 二維(多維)vector添加一個空項問題

    這篇文章主要介紹了C++ 二維(多維)vector添加一個空項問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

丽水市| 玛沁县| 扎赉特旗| 巴彦淖尔市| 准格尔旗| 常宁市| 金昌市| 依安县| 承德市| 女性| 宁都县| 三穗县| 台湾省| 镇坪县| 潼关县| 叶城县| 屏东市| 济南市| 南丹县| 长垣县| 紫金县| 五原县| 兰西县| 阿坝| 饶河县| 定兴县| 洪泽县| 云浮市| 峨眉山市| 吴川市| 兰州市| 怀集县| 石首市| 邵阳市| 静海县| 荣昌县| 宜黄县| 靖边县| 张家川| 永年县| 环江|