成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

刨析C語(yǔ)言常用的字符串函數(shù)與內(nèi)存函數(shù)及模擬實(shí)現(xiàn)

XBaron / 2226人閱讀

摘要:四函數(shù)字符串追加函數(shù)介紹函數(shù)的返回值類型為,可以返回被追加的字符串的起始地址。利用函數(shù)所需的頭文件函數(shù)的使用代碼運(yùn)行結(jié)果為函數(shù)的特點(diǎn)及注意事項(xiàng)源字符串必須以結(jié)束。目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。

文章目錄


一、C語(yǔ)言相關(guān)字符串庫(kù)函數(shù)一覽表

二、strlen函數(shù)(求字符串長(zhǎng)度)

strlen函數(shù)介紹

strlen函數(shù)是用于求字符串長(zhǎng)度的(不包括/0),例如字符串“abc”的長(zhǎng)度為3,在代碼中我們?nèi)绾问褂胹trlen函數(shù)呢?

#include int main(){ const char*str1 = "abcdef"; const char*str2 = "bbb"; if(strlen(str2)-strlen(str1)>0) { printf("str2>str1/n"); }  else { printf("srt1>str2/n"); } return 0; }

程序結(jié)果如圖:

我們的程序的結(jié)果可能會(huì)感到吃驚,字符串str2的長(zhǎng)度為3,字符串str1的長(zhǎng)度為6,那為什么最后打印的卻是str2>str1呢?

經(jīng)過(guò)查閱資料發(fā)現(xiàn),strlen函數(shù)返回值的類型為size_t(無(wú)符號(hào)整型),因此無(wú)符號(hào)整型之間的運(yùn)算結(jié)果仍然是無(wú)符號(hào)整型。3-6的確等于-3,而最終打印的是-3的補(bǔ)碼,而-3是二進(jìn)制原碼得到的。-3的原碼為10000000000000000000000000000011而-3的補(bǔ)碼為01111111111111111111111111111101,是個(gè)正數(shù),因此strlen(str2)-strlen(str1)的結(jié)果是大于0的。

strlen的特點(diǎn)及注意事項(xiàng):

  • 字符串已經(jīng) ‘/0’ 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 ‘/0’ 前面出現(xiàn)的字符個(gè)數(shù)(不包含 ‘/0’ )。
  • 參數(shù)指向的字符串必須要以 ‘/0’ 結(jié)束。
  • 注意函數(shù)的返回值為size_t,是無(wú)符號(hào)的。( 易錯(cuò) )
  • 調(diào)用strcpy函數(shù)所需的頭文件為string.h

strlen函數(shù)的模擬實(shí)現(xiàn)

方法一:計(jì)數(shù)器法

#include #include int my_strlen(const char* str){	int count = 0;	while (*str++!="/0")	{		count++;	}	return count;}int main(){	char* str1 = "abcdef";	int ret = my_strlen(str1);	printf("%d", ret);	return 0;}

代碼運(yùn)行結(jié)果:(以下的運(yùn)行結(jié)果跟下圖一致)

方法二:遞歸方法

#include #include int my_strlen(const char* str){    if(*str == "/0")       return 0;    else       return 1+my_strlen(str+1);}int main(){	char* str = "abcdef";	int ret = my_strlen(str);	printf("%d", ret);	return 0;}

方法三:指針減指針的方式

int my_strlen(char *s) {       char *p = s;       while(*p != ‘/0)              p++;       return p-s; }int main(){	char* str = "abcdef";	int ret = my_strlen(str);	printf("%d", ret);	return 0;}

三、strcpy函數(shù)(字符串拷貝)

strcpy函數(shù)介紹

先看strcpy函數(shù)的返回值類型與傳值。

查閱資料我們可以看到,strcpy函數(shù)傳入的第一個(gè)參數(shù)為目標(biāo)地址處,第二個(gè)參數(shù)為源地址處,返回值類型為char*類型。

例如以下代碼:

#include #include int main(){	char str1[20] = "abcdef";	char str2[] = "zjr";	strcpy(str1, str2);	printf("%s", str1);	return 0;}

代碼執(zhí)行結(jié)果如圖:

strpy函數(shù)的特點(diǎn)及注意事項(xiàng):

  • 源字符串必須以 ‘/0’ 結(jié)束。
  • 會(huì)將源字符串中的 ‘/0’ 拷貝到目標(biāo)空間。
  • 目標(biāo)空間必須足夠大,以確保能存放源字符串。
  • 目標(biāo)空間必須可變。

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

char *my_strcpy(char *dest, const char*src){  char *ret = dest; assert(dest != NULL); assert(src != NULL); while((*dest++ = *src++)) {    ; } return ret;}#include #include int main(){	char str1[20] = "abcdef";	char str2[] = "zjr";	my_strcpy(str1, str2);	printf("%s", str1);	return 0;}

在my_strcpy函數(shù)的形參中的源字符串地址使用了const的原因是:保證修改的是目的地字符串的內(nèi)容而不是源字符串的內(nèi)容。my_strcpy函數(shù)內(nèi)部使用了assert函數(shù)的目的是保證傳入的目的地字符串地址與源字符串地址都不為空指針,如果為空指針則程序代碼執(zhí)行時(shí)會(huì)報(bào)錯(cuò)。

如上代碼運(yùn)行結(jié)果為:

簡(jiǎn)單介紹下assert函數(shù):

頭文件為assert.h


傳入的為空指針就會(huì)報(bào)錯(cuò),否則不影響程序執(zhí)行。

四、strcat函數(shù)(字符串追加)

strcat函數(shù)介紹

strcat函數(shù)的返回值類型為char*,可以返回被追加的字符串的起始地址。而第一個(gè)參數(shù)為目的地字符串的地址,第二個(gè)參數(shù)為源字符串的地址。

利用strcat函數(shù)所需的頭文件:

strcat函數(shù)的使用:

#include #include int main(){	char str1[20] = "abcd";	char str2[] = "efgh";	char* ret = strcat(str1, str2);	printf("%s", ret);	return 0;}

代碼運(yùn)行結(jié)果為:

strcat函數(shù)的特點(diǎn)及注意事項(xiàng):

  • 源字符串必須以 ‘/0’ 結(jié)束。
  • 目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。
  • 目標(biāo)空間必須可修改。

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

 char *my_strcat(char *dest, const char*src)//保證源字符串不被修改 { char *ret = dest; assert(dest != NULL); assert(src != NULL); while(*dest) {    dest++;//先到目的地字符串的/0地址處 } while((*dest++ = *src++))//先解引用后++,因此最后能將源字符串內(nèi)的/0也追加進(jìn)去 {     ; } return ret;  }#include #include int main(){	char str1[20] = "abcd";	char str2[] = "efgh";	char* ret = my_strcat(str1, str2);	printf("%s", ret);	return 0;}

代碼執(zhí)行結(jié)果:

五、strcmp函數(shù)(字符串的比較)

strcmp函數(shù)介紹


strcmp函數(shù)的返回值類型為int,第一個(gè)參數(shù)為一個(gè)字符串首字母的地址,第二個(gè)參數(shù)為另一個(gè)字符串首字母的地址,依次往后作比較,這strcmp函數(shù)比較的是字符串的內(nèi)容,而不是字符串的長(zhǎng)度。

對(duì)于strcmp函數(shù)的返回值,C語(yǔ)言規(guī)定如果第一個(gè)字符串的內(nèi)容小于第二個(gè)字符串的內(nèi)容,則返回小于0的值;如果第一個(gè)字符串的內(nèi)容等于第二個(gè)字符串的內(nèi)容,則返回0,如果第一個(gè)字符串的內(nèi)容大于第二個(gè)字符串的內(nèi)容,則返回大于0的值。

#include #include int main(){	char str1[] = "abcd";	char str2[] = "abc";	int ret = strcmp(str1, str2);	printf("%d", ret);	return 0;}

代碼運(yùn)行結(jié)果:(結(jié)果雖然返回大于0的值都為1,但是每個(gè)編譯器此處規(guī)定返回大于0的值有所不同,此處會(huì)有差異)。

假如以上例子對(duì)strcmp函數(shù)是比較字符串內(nèi)容不夠清晰,以下例子能更好地觀察:

#include #include int main(){	char str1[] = "abcd";	char str2[] = "abq";	int ret = strcmp(str1, str2);	printf("%d", ret);	return 0;}

代碼運(yùn)行結(jié)果:

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

#include #include my_strcmp(const char* s1, const char* s2){	assert(s1 && s2);	while (*s1 == *s2)	{		if (*s1 == "/0")			return 0;		s1++;		s2++;	}	return *s1 - *s2;//比較字符串內(nèi)容}#include int main(){	char str1[] = "abcd";	char str2[] = "abq";	int ret = my_strcmp(str1, str2);	printf("%d", ret);	return 0;}

代碼運(yùn)行結(jié)果:

strcpy、strcat、strcmp都是長(zhǎng)度不受限制的字符串函數(shù),所以就顯得不夠安全。所以就有了strncpy、strncat、strncmp函數(shù)。

六、strncpy函數(shù)(受限制字符串拷貝)

strncpy函數(shù)介紹

strncpy函數(shù)的返回值類型為char*類型,該函數(shù)第一個(gè)參數(shù)為目的地字符串的首字母地址,第二個(gè)參數(shù)為源字符串的首字母地址,第三個(gè)參數(shù)為需要拷貝過(guò)去的字符個(gè)數(shù)。

使用strncpy函數(shù)所需的頭文件:

strncpy的使用:

#include #include int main(){	char str1[20] = "abcd";	char str2[] = "kpl";	char* ret = strncpy(str1, str2, 2);	printf("%s", ret);	return 0;}

代碼運(yùn)行結(jié)果:

strncpy函數(shù)的模擬實(shí)現(xiàn)

#include #include char* my_strncpy(char* dest, char* src, size_t count){	while (count--)//先使用count再減1	{		*(dest + count) = *(src + count);	}	return dest;}int main(){	char str1[20] = "abcd";	char str2[] = "kpl";	char* ret = my_strncpy(str1, str2, 2);	printf("%s", ret);	return 0;}

七、strncat函數(shù)(受限制字符串追加)

strncat函數(shù)介紹


strncat函數(shù)與其他的受限制的庫(kù)函數(shù)的返回值類型與參數(shù)幾乎一樣,此處不再進(jìn)行說(shuō)明。

使用strncat函數(shù)所需頭文件:

strncat函數(shù)的模擬實(shí)現(xiàn)

#include #include #include char* my_strncat(char* dest, char* src, size_t count){	assert(dest && src);	char* ret = dest;	while (*dest)	{		dest++;//到目的地字符串的/0位置	}	while (count--)	{		*(dest + count) = *(src + count);//字符串追加	}	return ret;}int main(){	char str1[20] = "abcd";	char str2[] = "kpl";	char* ret = my_strncat(str1, str2, 2);	printf("%s", ret);	return 0;}

八、strncmp函數(shù)(受限制字符串內(nèi)容比較)

strncmp函數(shù)介紹


strncmp函數(shù)的返回值類型為int型,返回值的規(guī)則跟strcmp函數(shù)相同,此處不再細(xì)講。第一個(gè)與第二個(gè)參數(shù):因?yàn)閮蓚€(gè)字符串只是用來(lái)作比較,如果修改則不滿足strncmp函數(shù)的使用規(guī)則,因此在前面兩個(gè)參數(shù)前面加上const保證字符串內(nèi)容不被修改。第三個(gè)參數(shù)為比較的字符個(gè)數(shù)。

使用strncmp函數(shù)所需的頭文件:

strncmp函數(shù)的使用:

#include #include int main(){	char str1[] = "abcd";	char str2[] = "abkl";	int ret = strncmp(str1, str2, 2);	printf("%d", ret);	return 0;}

代碼運(yùn)行結(jié)果:

strncmp函數(shù)的模擬實(shí)現(xiàn)

#include #include #include int my_strncmp(char* s1, char* s2, size_t count){	assert(s1 && s2);	while (count--)	{		if (*s1 == *s2)		{			s1++;			s2++;		}	}	return *s1 - *s2;}int main(){	char str1[] = "abcd";	char str2[] = "abkl";	int ret = my_strncmp(str1, str2, 2);	printf("%d", ret);	return 0;}

代碼執(zhí)行結(jié)果:

九、strstr函數(shù)(字符串查找函數(shù))


strstr函數(shù)的返回值類型為char類型,第一個(gè)參數(shù)是被查找的字符串,第二個(gè)參數(shù)是在第一個(gè)參數(shù)中需要查找的字符串。例如:第一個(gè)字符串為i am a student,第二個(gè)字符串為a,則返回的char類型用字符串形式打印的結(jié)果為am a student 。

使用strstr函數(shù)所需的頭文件:

strstr函數(shù)的使用:

#include #include int main(){	char str1[] = "abcdefdgh";	char str2[] = "d";	char* ret = strstr(str1, str2);	printf("%s", ret);	return 0;}

代碼執(zhí)行結(jié)果:

strstr函數(shù)的模擬實(shí)現(xiàn)

#include #include char* my_strstr(const char* str1, const char* str2){	char* s1, * s2;	char* cp = str1;	if (*str2 == "/0")	{		return str1;	}	while (*cp)	{		s1 = cp;			s2 = str2;		while (*s1 && *s2 && *s1 == *s2)//開(kāi)始遍歷尋找		{			s1++;			s2++;		}		if (*s2 == "/0")		{			return cp;		}		cp++;//當(dāng)字符查找途中發(fā)現(xiàn)有不相同的字符,則從剛開(kāi)始查找處的下一個(gè)字符開(kāi)始查找	}	return NULL;}int main(){
              
  
最新活動(dòng)
閱讀需要支付1元查看
<