成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

XBaron / 2176人閱讀

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


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

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

strlen函數(shù)介紹

strlen函數(shù)是用于求字符串長度的(不包括/0),例如字符串“abc”的長度為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é)果可能會感到吃驚,字符串str2的長度為3,字符串str1的長度為6,那為什么最后打印的卻是str2>str1呢?

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

strlen的特點及注意事項:

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

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

方法一:計數(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;}

代碼運行結(jié)果:(以下的運行結(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ù)傳入的第一個參數(shù)為目標地址處,第二個參數(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ù)的特點及注意事項:

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

strcpy函數(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í)行時會報錯。

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

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

頭文件為assert.h


傳入的為空指針就會報錯,否則不影響程序執(zhí)行。

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

strcat函數(shù)介紹

strcat函數(shù)的返回值類型為char*,可以返回被追加的字符串的起始地址。而第一個參數(shù)為目的地字符串的地址,第二個參數(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;}

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

strcat函數(shù)的特點及注意事項:

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

strcat函數(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也追加進去 {     ; } 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,第一個參數(shù)為一個字符串首字母的地址,第二個參數(shù)為另一個字符串首字母的地址,依次往后作比較,這strcmp函數(shù)比較的是字符串的內(nèi)容,而不是字符串的長度。

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

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

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

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

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

代碼運行結(jié)果:

strcmp函數(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;}

代碼運行結(jié)果:

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

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

strncpy函數(shù)介紹

strncpy函數(shù)的返回值類型為char*類型,該函數(shù)第一個參數(shù)為目的地字符串的首字母地址,第二個參數(shù)為源字符串的首字母地址,第三個參數(shù)為需要拷貝過去的字符個數(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;}

代碼運行結(jié)果:

strncpy函數(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ù)與其他的受限制的庫函數(shù)的返回值類型與參數(shù)幾乎一樣,此處不再進行說明。

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

strncat函數(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ù)相同,此處不再細講。第一個與第二個參數(shù):因為兩個字符串只是用來作比較,如果修改則不滿足strncmp函數(shù)的使用規(guī)則,因此在前面兩個參數(shù)前面加上const保證字符串內(nèi)容不被修改。第三個參數(shù)為比較的字符個數(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;}

代碼運行結(jié)果:

strncmp函數(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類型,第一個參數(shù)是被查找的字符串,第二個參數(shù)是在第一個參數(shù)中需要查找的字符串。例如:第一個字符串為i am a student,第二個字符串為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ù)的模擬實現(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)//開始遍歷尋找		{			s1++;			s2++;		}		if (*s2 == "/0")		{			return cp;		}		cp++;//當字符查找途中發(fā)現(xiàn)有不相同的字符,則從剛開始查找處的下一個字符開始查找	}	return NULL;}int main(){
              
  
最新活動
閱讀需要支付1元查看
<