1. strlen函數的使用和模擬實現
size_t strlen(const char* str);
1.1 函數功能以及用法
字符串長度
strlen函數的功能是計算字符串的長度。在使用時,要求用戶傳入需要計算長度的字符串的起始位置,并返回字符串的長度。
#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef";int len = strlen(arr);printf("%d\n", len);return 0;
}
1.2 函數的原理
該函數在得到字符串的起始位置之后,會從該起始位置開始依次向后檢索并計數,直到遇到'\0'為止。
1.3 注意事項
1. 字符串以 '\0' 作為結束標志,strlen函數返回的是在字符串中 '\0' 前?出現的字符個數(不包 含 '\0' )。
2. 參數指向的字符串必須要以 '\0' 結束。
3. 注意函數的返回值為size_t,是無符號的( 易錯 )
針對第三點,我們給出以下示例
#include <stdio.h>
#include <string.h>
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;
}
由于strlen函數返回值的類型為“size_t”(unsigned int),所以兩個strlen函數返回值相減,得到的結果的類型也是“size_t”,而該類型的數據一定會是大于等于零的,這與我們的代碼所表達的意思不一致。
1.4 模擬實現
strlen的實現較為簡單,所以這里給出三種實現方式:
1.4.1 計數器
在函數內部創建一個計數器,用以記錄字符的個數
size_t my_strlen1(const char* str)
{assert(str);size_t count = 0;//計數器while(*str != '\0'){count++;str++;}return count;
}
1.4.2? 指針-指針
size_t my_strlen2(const char* str)
{assert(str);const char* strx = str;while(*strx != '\0'){strx++;}return strx - str;//指針-指針
}
1.4.3 遞歸
size_t my_strlen3(const char* str)
{assert(str);if(*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}
2. strcpy函數的使用和模擬實現
char* strcpy(char * destination, const char* source);
2.1 函數功能以及用法
字符串拷貝
該函數會把“source”指向的字符串拷貝到“destination”指向的字符數組數組中,包括'\0'。在使用時,要求用戶分別傳入目標數組的起始地址和源字符串的起始地址,并返回目標數組的起始地址
#include <stdio.h>
#include <string.h>int main()
{char name[20] = {0};strcpy(name, "zhangsan");printf("%s\n", name);return 0;
}
2.2 函數的原理
“destination”和“source”依次逐字節移動,每次移動前將“source”指向的字符拷貝到“destination”指向的空間,直到將'\0'拷貝到目標數組中為止。
2.3 注意事項
1. 源字符串必須以 '\0' 結束。
2. 會將源字符串中的 '\0' 拷?到?標空間。
3. ?標空間必須?夠?,以確保能存放源字符串。
4. ?標空間必須可修改。比如目標空間是處存放的是一個常字符串或者被const修飾的字符數組。
#include <stdio.h>
#include <string.h>int main()
{const char* p = "abcdef";char arr[] = "bit";strcpy(p, arr);return 0;
}
2.4 模擬實現
char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest++ = *src++);return ret;
}
3. strcat函數的使用和模擬實現
char* strcat(char* destination, const char* source);
3.1 函數功能以及用法
字符串追加
該函數會將“source”指向的字符串追加到“destination”指向的字符數組的后面,原本的'\0'會被覆蓋,源字符串的'\0'會被一起追加到字符數組之后(某些實現中可能是額外添加的'\0')。在使用時,要求用戶分別傳入目標數組的起始地址和源字符串的起始地址,并返回目標數組的起始地址。
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";strcat(arr1, "world!");printf("%s\n", arr1);return 0;
}
3.2 函數的原理
首先找到目標數組結尾處的'\0',將其當作目標空間的起始地址的話,接下來的步驟就與strcpy相同了。
3.3 注意事項
1. 源字符串必須以 '\0' 結束。
2. ?標字符串中也得有 \0 ,否則沒辦法知道追加從哪?開始。
3. ?標空間必須有?夠的?,能容納下源字符串的內容。
4. ?標空間必須可修改。
5. 字符串自己給自己追加可能會出錯。
#include <stdio.h>
#include <string.h>int main()
{char arr[20] = "hello";strcat(arr, arr);printf("%s\n", arr);return 0;
}
在第一個字符拷貝結束時,arr結尾的'\0'就被覆蓋了,這時,strcat函數就不知道追加應該何時停止。?
3.4 模擬實現
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest){dest++;}while(*dest++ = *src++);return ret;
}
4. strcmp函數的使用和模擬實現
int strcmp(const char* str1, const char* str2);
4.1 函數功能以及用法
字符串比較
C語言標準規定:
第?個字符串?于第?個字符串,則返回?于0的數字 。
第?個字符串等于第?個字符串,則返回0 。
第?個字符串?于第?個字符串,則返回?于0的數字。
#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "zhangsan";char arr2[] = "zhangsanfeng";int ret = my_strcmp(arr1, arr2);if(ret < 0)printf("<\n");else if(ret == 0)printf("=\n");elseprintf(">\n");return 0;
}
4.2 函數的原理
按下標依次比較兩個字符串元素的ascll碼值。
4.3 注意事項
好像沒什么好注意的。
4.4 模擬實現
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);
}