C語言之字符串函數
文章目錄
- C語言之字符串函數
- 1. strlen的使用和模擬實現
- 1.1 strlen的使用
- 1.2 strlen的模擬實現
- 2. strcpy的使用和模擬實現
- 2.1 strcpy的使用
- 2.2 strncpy的使用
- 2.3 strcpy的模擬實現
- 3. strcat的使用和模擬實現
- 3.1 strcat的使用
- 3.2 strncat
- 3.3 strcat的模擬實現
- 4. strcmp 的使?和模擬實現
- 4.1 strcmp的使用
- 4.2 strncmp
- 4.3 strcmp的模擬實現
1. strlen的使用和模擬實現
? 字符串以 ‘\0’ 作為結束標志,strlen函數返回的是在字符串中 ‘\0’ 前?出現的字符個數(不包含 ‘\0’ )。
? 參數指向的字符串必須要以 ‘\0’ 結束。
? 注意函數的返回值為size_t,是?符號的
1.1 strlen的使用
strlen函數的聲明
size_t strlen ( const char * str );
strlen函數是用來計算字符串的長度的,計算的是 ’ \0 '之前字符的總個數
例子:
#include <stdio.h>
#include <string.h> //使用strlen需要包含的頭文件
int main()
{char arr[] = "abcdef";strlen(arr);printf("%s\n", arr);return 0;
}
運行結果為 6
與sizeof不同的是,sizeof計算的數組中的元素個數包括’ \0 ',詳細可看sizeof和strlen
1.2 strlen的模擬實現
給strlen傳一個地址,然后它就會計算’\0’之前字符的總個數,并且返回值是size_t即無符號整型
代碼如下:
#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t my_strlen1(const char* str)//通過計數器的方式
{assert(str != NULL); //assert斷言,判斷傳入的地址是否為空指針int count = 0; while (*str != '\0')//str中的內容不為'\0'的時候進入循環{count++;str++;}return count;}
size_t my_strlen2(const char* str)//指針 - 指針 計算的是兩個指針之間的元素個數
{char* start = str;assert(str != NULL);while (*str != '\0'){str++;}return str - start;}
size_t my_strlen3(const char* str) //遞歸的方式
//假設傳入一個字符串"abc"
//遞的過程
//第一次進入函數,*str == a 調用本身1 + my_strlen3("bc")
//第二次進入函數,*str == b 調用本身1 + 1 + my_strlen3("c")
//第三次進入函數,*str == c 調用本身1 + 1 + 1 + my_strlen3(" ")
//第四次進入函數,*str == '\0' ,開始歸
//第四次返回一個0,0 + 1 + 1 + 1
{if (*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}int main()
{char arr[] = "abcdef";size_t len1 = my_strlen1(arr);size_t len2 = my_strlen2(arr);size_t len3 = my_strlen3(arr);printf("%zd\n",len1 );printf("%zd\n",len2 );printf("%zd\n",len3 );return 0;
}
以上為三種strlen的模擬實現,代碼運行如下:
2. strcpy的使用和模擬實現
? 源字符串必須以 ‘\0’ 結束。
? 會將源字符串中的 ‘\0’ 拷?到?標空間。
? ?標空間必須?夠?,以確保能存放源字符串。
? ?標空間必須可修改。
2.1 strcpy的使用
函數聲明如下:
char * strcpy ( char * destination, const char * source );
strcpy用來將source中的字符串,拷貝到destination中去
例子:
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = { "xxxxxxxx"};char arr2[] = "abc";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
代碼運行結果如下:
可以看到strcpy將arr2中的元素拷貝了一份到arr1中,同時在后面加上了一個’\0’,所以abc之后的x不會打印
2.2 strncpy的使用
要想拷貝指定數量的元素可以使用strncpy
函數聲明如下:
char * strncpy ( char * destination, const char * source, size_t num );
和strcpy差不多,只是多了一個size_t num這個形參,這個是用來拷貝指定數量的
例子:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";strncpy(arr1, arr2,3);printf("%s\n", arr1);return 0;
}
代碼運行結果如下:
只會將arr2中前面3個元素拷貝到arr1中
2.3 strcpy的模擬實現
strcpy是用來將兩個數組中下標一致的元素,將source中的字符拷貝到destination中去,一個一個拷貝
代碼如下:
寫法一:
char* my_strcpy(char* dest, char* src)
{char* ret = dest;assert(dest != NULL);assert(src != NULL);while (*src) //當src中的元素不為'\0'時進入循環{*dest = *src; //將src中的值賦給dest*src++; //src++,找到下一個元素的地址*dest++; //dest++,找到下一個元素的地址}*dest = *src; //由于當src中的元素為'\0'時,循環結束了,'\0'不會賦值到dest中去,使用最后將'\0'賦值給destreturn ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
寫法二:
```c
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, char* src)
{char* ret = dest;assert(dest != NULL); //判斷傳入的指針不是空指針assert(src != NULL);while (*dest++ = *src++)// *dest = *src 將src的值拷貝到dest//拷貝完之后,通過指針偏移找到下一個元素//++是先使用后加{//因為只是拷貝元素,while里面不做什么事//使用while必須跟一個語句,使用加上了一個空語句//使用大括號里邊可以不加,但是加上會更清晰一點;}return ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abcdef";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}
3. strcat的使用和模擬實現
? 源字符串必須以 ‘\0’ 結束。
? ?標字符串中也得有 \0 ,否則沒辦法知道追加從哪?開始。
? ?標空間必須有?夠的?,能容納下源字符串的內容。
? ?標空間必須可修改。
3.1 strcat的使用
函數聲明如下:
char * strcat ( char * destination, const char * source );
strcat是將source中的元素追加到destination之后,可以理解為兩個字符串的拼接
例子如下:
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "world";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
3.2 strncat
要想追加指定元素,可以使用strncat
代碼如下:
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";char arr2[] = "worldabcdef";strncat(arr1, arr2,5);printf("%s\n", arr1);return 0;
}
運行結果如下:
只會將arr2中前五個元素追加到arr1中去,之后的元素則不會追加
3.3 strcat的模擬實現
strcat是先找到destination中的’\0’,然后再其后面開始追加元素
代碼如下:
include <stdio.h>
#include <string.h>
#include <assert.h>char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*dest) //當dest中的元素不為'\0'時,dest++,找到'\0'的位置{dest++;}while (*dest++ = *src++) //從'\0'之后的位置開始將src中的元素賦值給dest{;}return ret;
}
int main()
{char arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}
4. strcmp 的使?和模擬實現
? 第?個字符串?于第?個字符串,則返回?于0的數字
? 第?個字符串等于第?個字符串,則返回0
? 第?個字符串?于第?個字符串,則返回?于0的數字
? 比較的是兩個元素的ASCII值
4.1 strcmp的使用
函數聲明如下:
int strcmp ( const char * str1, const char * str2 );
比較str1和str2中下標相同元素的ASCII值
如果第一個元素相等時,則比較下一對元素的ASCII值
大于則返回一個大于零的值
小于則返回一個小于零的值
等于則返回零
例子:
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = strcmp(arr1, arr2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}
由于前兩個元素相同,所以比較第三個元素的ASCII值
q的ASCII值大于c的ASCII值
所以會打印小于
4.2 strncmp
可以指定比較的元素個數
代碼如下:
#include <stdio.h>
#include <string.h>int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = strncmp(arr1, arr2,2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}
由于只比較了前兩個元素的ASCII值,前兩個元素相等
所以會打印等于
4.3 strcmp的模擬實現
代碼如下:
#include <stdio.h>
#include <string.h>
#include <assert.h>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;}
int main()
{char arr1[] = "abcd";char arr2[] = "abq";int ret = my_strcmp(arr1, arr2);if (ret > 0)printf("大于\n");else if (ret == 0)printf("等于\n");elseprintf("小于\n");return 0;
}