真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C-字符(串)函數(shù)及內(nèi)存函數(shù)-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)建站一直秉承“誠(chéng)信做人,踏實(shí)做事”的原則,不欺瞞客戶(hù),是我們最起碼的底線(xiàn)! 以服務(wù)為基礎(chǔ),以質(zhì)量求生存,以技術(shù)求發(fā)展,成交一個(gè)客戶(hù)多一個(gè)朋友!為您提供成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、成都網(wǎng)頁(yè)設(shè)計(jì)、微信小程序開(kāi)發(fā)、成都網(wǎng)站開(kāi)發(fā)、成都網(wǎng)站制作、成都軟件開(kāi)發(fā)、重慶App定制開(kāi)發(fā)是成都本地專(zhuān)業(yè)的網(wǎng)站建設(shè)和網(wǎng)站設(shè)計(jì)公司,等你一起來(lái)見(jiàn)證!

求字符串長(zhǎng)度

頭文件

strlen - 計(jì)算字符串長(zhǎng)度

函數(shù)聲明

strlen 函數(shù)模擬

PS.strlen計(jì)算出來(lái)的為無(wú)符號(hào)數(shù),兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算恒為正

長(zhǎng)度不受限制的字符串函數(shù)

頭文件

PS.此類(lèi)函數(shù)只關(guān)注 '\0',使用時(shí)可能會(huì)越界訪(fǎng)問(wèn)

strcpy - 字符串拷貝

函數(shù)聲明

strcpy 函數(shù)模擬

strcat - 字符串追加

函數(shù)聲明

strcat 發(fā)生C4996錯(cuò)誤解決

strcat 函數(shù)模擬

strcmp - 字符串比較

函數(shù)聲明

strcmp 函數(shù)模擬

長(zhǎng)度受限制的字符串函數(shù)

頭文件

strncpy - 字符串拷貝

函數(shù)聲明

strncat - 字符串追加

函數(shù)聲明

strncmp - 字符串比較

函數(shù)聲明

查找字符串

頭文件

strstr - 查找字符串

函數(shù)聲明

PS.NULL/null - 空指針? ? ? ? NUL/Null - '\0'

strstr 函數(shù)模擬

strtok - 拆解字符串

函數(shù)聲明

字符串報(bào)錯(cuò)

頭文件

strerror - 錯(cuò)誤報(bào)告

函數(shù)聲明

字符分類(lèi)函數(shù)

頭文件

字符轉(zhuǎn)換函數(shù)

頭文件

內(nèi)存函數(shù)

頭文件

memcpy - 拷貝函數(shù)

函數(shù)聲明

memcpy 函數(shù)模擬(不包括內(nèi)存重疊的情況)

memmove - 處理重疊拷貝函數(shù)

函數(shù)聲明

memmove 函數(shù)模擬

memcmp - 比較函數(shù)

函數(shù)聲明

memset - 內(nèi)存設(shè)置函數(shù)

函數(shù)聲明


求字符串長(zhǎng)度 頭文件
#include
strlen - 計(jì)算字符串長(zhǎng)度 函數(shù)聲明
size_t strlen (const char* str); //size_t == unsigned int

字符串以 '\0' 作為結(jié)束標(biāo)志,strlen 函數(shù)返回的是在字符串中?'\0' 前面出現(xiàn)的字符個(gè)數(shù)

參數(shù)指向的字符串要以?'\0' 結(jié)束

#includeint main()
{
	char arr[] = { 'a','b','c' };
    //在后面加入'\0'時(shí),就不會(huì)計(jì)算成隨機(jī)值了
    //即:{ 'a','b','c','\0' }
	int len = strlen(arr);
	printf("%d", len);
	return 0;
}
strlen 函數(shù)模擬

指針

#include#include 
unsigned int strlen_s(char* str)
{ //此處 unsigned int 是符合原函數(shù)聲明
  //寫(xiě)為 int 也可以
	int count = 0;
    assert(str != NULL);
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

遞歸

#includeint my_strlen(char* str)
{
    if (*str != '\0')
    {
        return 1 + strlen_s(str + 1);
    }
    else
    {
        return 0;
    }
}
PS.strlen計(jì)算出來(lái)的為無(wú)符號(hào)數(shù),兩個(gè)無(wú)符號(hào)數(shù)進(jìn)行運(yùn)算恒為正 長(zhǎng)度不受限制的字符串函數(shù) 頭文件
#include
PS.此類(lèi)函數(shù)只關(guān)注 '\0',使用時(shí)可能會(huì)越界訪(fǎng)問(wèn) strcpy - 字符串拷貝 函數(shù)聲明
char* strcpy(char* destination, const char* source);

destination - 目標(biāo)數(shù)組

source - 起始數(shù)組

源字符串中必須要以 '\0' 結(jié)束

目標(biāo)字符串空間要足夠大

目標(biāo)空間大小要可修改

#include#includeint main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "yes";
	strcpy(arr1, arr2);
	//拷貝的時(shí)候 '\0' 也會(huì)拷貝過(guò)去
	return 0;
}
strcpy 函數(shù)模擬
#include#include 
char* my_strcpy(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	char* ret = dest;
    //拷貝 src 指向的字符串到 dest
	while (*dest++ = *src++)
	{
		;
	}
    //返回目的空間的起始地址
	return ret;
}
strcat - 字符串追加 函數(shù)聲明
char* strcat(char* destination, const char* source);

追加字符串時(shí)是從第一個(gè) '\0' 開(kāi)始,源字符串中的?'\0' 也會(huì)追加過(guò)去

目標(biāo)空間要足夠大,能容納下源字符串的內(nèi)容

目標(biāo)空間必須可以修改

字符串自己給自己追加時(shí)會(huì)出錯(cuò),程序崩潰?

#include#includeint main()
{
	char ch1[20] = "Hello";
	char ch2[] = "World";
	strcat(ch1, ch2);
	printf("%s\n", ch1);
	return 0;
}
strcat 發(fā)生C4996錯(cuò)誤解決

方法一:項(xiàng)目右鍵 - 屬性 - C/C++ - 預(yù)處理器 - 預(yù)處理器定義 - 編輯,加上

?????_CRT_SECURE_NO_DEPRECATE

方法二:在程序最前面加上

????#define _CRT_SECURE_NO_WARNINGS

strcat 函數(shù)模擬
#include#include 
char* my_strcat(char* dest, const char* src)
{
	assert(dest != NULL);
	assert(src != NULL);
	//兩行代碼可縮寫(xiě)為 assert(dest && src);
	char* ret = dest;
	while (*dest != '\0')
	{
		dest++;
	}
	while (*dest++ = *src++)
	{
		; //追加時(shí)的代碼和 strcpy 一樣
	}
	return ret;
}
strcmp - 字符串比較 函數(shù)聲明
int strcmp(const char* str1, const char* str2);

str1 >str2,返回值 >0

str1 = str2,返回值?= 0

str1

比較首字符大小(根據(jù)ASCII碼表比較),而非字符串長(zhǎng)度

當(dāng)首字符相等時(shí),比較第二位字符,以此類(lèi)推

#include#includeint main()
{
	char* p1 = "abc";
	char* p2 = "xyz";
	int a = strcmp(p1, p2);
	printf("%d\n", a);
	return 0; //打印 -1
}
strcmp 函數(shù)模擬
#include#include 
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	if (*str1 >*str2)
		return 1;
	else
		return -1;
}
#include#include 
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
			return 0;
		str1++;
		str2++;
	}
	return (*str1 - *str2);
}
長(zhǎng)度受限制的字符串函數(shù) 頭文件
#include
strncpy - 字符串拷貝 函數(shù)聲明
char* strncpy(char* destination, const char* source, size_t count);

count - 拷貝的字節(jié)數(shù) - 單位為字節(jié)

count 數(shù)字如果大于 source 字符個(gè)數(shù),不足就補(bǔ) '\0'

strncat - 字符串追加 函數(shù)聲明
char* strcat(char* destination, const char* source, size_t count);

count - 追加的字節(jié)數(shù) - 單位為字節(jié)

strncmp - 字符串比較 函數(shù)聲明
int strcmp(const char* str1, const char* str2, size_t count);

count - 比較的字節(jié)數(shù) - 單位為字節(jié)

如 count =?3,則各自比較前3個(gè)字符

查找字符串 頭文件
#include
strstr - 查找字符串 函數(shù)聲明
char* strstr(const char *haystack, const char *needle);

haystack - 要被檢索的字符串

needle?-?在 haystack 字符串內(nèi)要搜索的小字符串

該函數(shù)返回在 haystack 中第一次出現(xiàn) needle 字符串的位置,如果未找到則返回NULL - 空指針

打印時(shí) %p - 找到返回地址,未找到返回NULL

? %s - 找到返回需要找的字符串及之后的字符串,未找到返回NULL

PS.NULL/null - 空指針? ? ? ? NUL/Null - '\0' strstr 函數(shù)模擬
#include#include 
char* my_strstr(const char* p1, const char* p2)
{
	assert(p1 && p2);
	char* s1, * s2;
	char* start = p1;
	//p1 為 const char* 類(lèi)型,而 start 為 char* 類(lèi)型
	//此處可將 p1 強(qiáng)制類(lèi)型轉(zhuǎn)換為 char* 類(lèi)型
	while (*start)
	{
		s1 = start;
		s2 = p2;
		while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return start;
		if (*s1 == '\0')
			return NULL;
		start++;
	}
	return NULL;
}
strtok - 拆解字符串 函數(shù)聲明
char* strtok(char *str, const char *delim);

str?-?要被分解成一組小字符串的字符串

delim?-?包含分隔符的字符串??

該函數(shù)返回被分解的第一個(gè)子字符串,如果沒(méi)有可檢索的字符串,則返回一個(gè)NULL - 空指針

strtok 函數(shù)會(huì)拷貝一份源字符串,對(duì)拷貝的字符串進(jìn)行拆解?

  • 當(dāng) strtok 函數(shù)的第一個(gè)參數(shù)為NULL時(shí),函數(shù)將找到 str 中的第一個(gè)標(biāo)記,strtok 函數(shù)將保存它在字符串中的位置
  • 當(dāng) strtok 函數(shù)的第一個(gè)參數(shù)不為NULL時(shí),函數(shù)將在剛才的那個(gè)字符串中被保存的位置開(kāi)始查找下一個(gè)標(biāo)記,進(jìn)行獲取第二個(gè)、第三個(gè)子字符串
  • 當(dāng)字符串中不存在更多的標(biāo)記,則返回NULL - 空指針
#include#includeint main()
{
    char arr[] = "StarDustShakeHand@hotmail.com";
    const char* ch = "@.";
    char* ret;
    for (ret = strtok(arr, ch); ret != NULL; )
    {
        printf("%s\n", ret);
        ret = strtok(NULL, ch);
    }
    return 0;
}
字符串報(bào)錯(cuò) 頭文件
#include
strerror - 錯(cuò)誤報(bào)告 函數(shù)聲明
char* strerror(int errnum);

輸入錯(cuò)誤碼,返回錯(cuò)誤信息

#include#includeint main()
{
    char* str = strerror(0);
    printf("%s\n", str);
    //打印 No error
    return 0;
}
#include#includeint main()
{
    char* str = strerror(1);
    printf("%s\n", str);
    //打印 Operation not permitted
    return 0;
}

錯(cuò)誤碼輸入 errno,errno是一個(gè)全局的錯(cuò)誤碼變量,當(dāng)C語(yǔ)言庫(kù)函數(shù)在執(zhí)行過(guò)程中發(fā)生了錯(cuò)誤,就會(huì)把對(duì)應(yīng)的錯(cuò)誤碼賦值到 errno 中

字符分類(lèi)函數(shù) 頭文件
#include
函數(shù)參數(shù)滿(mǎn)足以下條件則返回真
iscntrl任何控制字符
isspace空白字符:空格;換頁(yè)'\f';換行'\n';回車(chē)'\r',制表符'\t';垂直制表符'\v'
isdigit十進(jìn)制數(shù) 0 ~ 9
isxdigit十六進(jìn)制數(shù) 0 ~ 9;A ~ F;a ~ f
islower小寫(xiě)字母 a ~ z
isupper大寫(xiě)字母 A ~ Z
isalpha小寫(xiě)或大寫(xiě)字母
isalnum字母或十進(jìn)制數(shù)字
ispunct標(biāo)點(diǎn)符號(hào),可打印的不屬于數(shù)字或字母的圖形字符
isgraph任何圖形字符
isprint任何可打印的字符(包括圖形、空白字符
字符轉(zhuǎn)換函數(shù) 頭文件
#include
函數(shù)用處
tolower將小寫(xiě)字符轉(zhuǎn)為大寫(xiě)字符
toupper將大寫(xiě)字符轉(zhuǎn)為小寫(xiě)字符
內(nèi)存函數(shù) 頭文件
#include//或者
#include

作用范圍比字符串函數(shù)大,任何類(lèi)型的數(shù)據(jù)都能操作

memcpy - 拷貝函數(shù) 函數(shù)聲明
void* memcpy(void* destination, const void* source, size_t num);
  • memcpy 函數(shù)從 source 的位置開(kāi)始向后復(fù)制?num 個(gè)字節(jié)的數(shù)據(jù)到 destination 的內(nèi)存位置
  • 遇到 '\0' 時(shí)不會(huì)停下
  • 當(dāng) source 和 destination 有任何的重疊,復(fù)制的結(jié)果都是未定義的?

memcpy 處理內(nèi)存不重疊的情況就行

memmove 要可以處理內(nèi)存重疊的情況?

#include#includeint main()
{
    int arr1[] = { 1,2,3,4,5 };
    int arr2[5] = { 0 };
    memcpy(arr2, arr1, sizeof(arr1));
    return 0;
}
#include#includestruct Stu
{
    char name[20];
    int age;
};
int main()
{
    struct Stu arr1[] = { {"小明",18},{"小紅",19},{"小剛",20} };
    struct Stu arr2[3] = { 0 };
    memcpy(arr2, arr1, sizeof(arr1));
    return 0;
}
memcpy 函數(shù)模擬(不包括內(nèi)存重疊的情況)
#include#include 
void* my_memcpy(void* dest, const void* src, size_t num)
{
	assert(dest && src);
    char* ret = dest;
	while (num--)
		*((char*)dest)++ = *((char*)src)++;
	return ret;
} //dest 會(huì)改變,最好還是 void* ret
memmove - 處理重疊拷貝函數(shù) 函數(shù)聲明
void* memmove(void* destination, const void* source, size_t num);

可處理內(nèi)存重疊的情況

memmove 函數(shù)模擬
#include#include 
void* my_memmove(void* dest, const void* src, size_t num)
{	
	assert(dest && src);
    void* ret = dest;
	if (dest< src)
	{
		while (num--)
			*((char*)dest)++ = *((char*)src)++;
	}
	else
	{
		while (num--)
			*((char*)dest + num) = *((char*)src + num);
	}
	return ret;
} //dest 會(huì)改變,最好還是 void* ret
memcmp - 比較函數(shù) 函數(shù)聲明
int memcmp(const void* ptr1, const void* ptr2, size_t num);

比較從 ptr1 和 ptr2 指針開(kāi)始的 num 個(gè)字節(jié),比出大小時(shí)就停止

ptr1 >ptr2,返回值 >0

ptr1 = ptr2,返回值?= 0

ptr1< ptr2,返回值

#include#includeint main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[] = { 1,3,2,4,5,6,7,8,9,10 };
	int a = memcmp(arr1, arr2, 5);
    //a< 0
	return 0;
}
memset - 內(nèi)存設(shè)置函數(shù) 函數(shù)聲明
void* memset(void* str, int c, size_t n);

str?-?指向要填充的內(nèi)存塊

c?-?要被設(shè)置的值。該值以 int 形式傳遞,但在函數(shù)中時(shí)是使用該值的無(wú)符號(hào)字符形式

n?-?要被設(shè)置為該值的字符數(shù) - 單位為字節(jié)

#include#includeint main()
{
	char arr[10] = "";
	memset(arr, '#', 10);
	return 0;
}
#include#includeint main()
{
	int arr[10] = { 0 };
	memset(arr, 1, sizeof(arr));
	//元素都變?yōu)?16843009,memset 是一個(gè)字節(jié)一個(gè)字節(jié)地改
	return 0;
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


網(wǎng)站題目:C-字符(串)函數(shù)及內(nèi)存函數(shù)-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://weahome.cn/article/icsoi.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部