strcpy、strcmp、strlen、strcat函式的模擬實現
阿新 • • 發佈:2020-12-23
技術標籤:c++
常見字串函式的模擬實現
strlen
size_t strlen( const char *string );
- 和 sizeof 區別開來。sizeof是求字串的大小,會將 '\0’也算進大小,strlen函式是求字串的長度,長度不包含 ‘\0’
- 引數指向的字串必須要以 ‘\0’ 結束
- 注意函式的返回值為size_t,是無符號整型
size_t my_strlen(const char *string)
{
assert(string); //檢查合法性
char *str = (char*)string; //保護引數
size_t len = 0;
while (*str)
{
str++;
len++;
}
return len;
}
int main()
{
char *str = "abcdefghijklmnopqrstuvwxyz"; //26個英文字母噢兄弟們,不是24個哈哈哈,我是有證據的,看下面
int ret = my_strlen(str);
printf("str length = %d\n", ret);
return 0;
}
strcpy
char * strcpy( char *strDestination, const char *strSource );
- 返回值是目標空間的首地址
- 源字串必須以‘\0’結尾,並且strcpy函式會將‘\0’一併複製到目標空間
- 目標空間必須是可變的
- 目標空間必須足夠放下源字串(注意包含‘\0’的長度)
char *my_strcpy(char *strDestination, const char *strSource)
{
assert(strDestination && strSource); //檢查合法性
char *dest = (char*)strDestination; //保護引數
char *src = (char*)strSource;
while (*src) //相當於while(*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = '\0'; //給目標空間結尾加字串結束標誌
return strDestination;
}
int main()
{
char str1[80];
char *str2 = "abcdefghijklmnopqrstuvwxyz";
my_strcpy(str1, str2);
printf("%s\n",str1);
return 0;
}
strcmp
int strcmp( const char *string1, const char *string2 );
- 第一個字串**大於**第二個字串,則返回大於0的數字
- 第一個字串**等於**第二個字串,則返回0
- 第一個字串**小於**第二個字串,則返回小於0的數字
int my_strcmp(const char *string1, const char *string2)
{
assert(string1 && string2); //檢查合法性
char *str1 = (char*)string1; //保護引數
char *str2 = (char*)string2;
int size1 = strlen(str1); //判斷長度
int size2 = strlen(str2);
if (size1 > size2)
return 1;
else if (size1 < size2)
return -1;
while (*str1) //經過前面的判斷長度之後,能執行到這裡肯定是兩字串長度相等的情況
{
int ret = 0;
ret = *str1 - *str2;
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
}
return 0;
}
int main()
{
char *str1 = "bbcd";
char *str2 = "abcd";
int ret = my_strcmp(str1, str2);
if (ret == 1)
printf("str1 > str2\n");
if (ret == 0)
printf("str1 = str2\n");
if (ret == -1)
printf("str1 < str2\n");
return 0;
}
strcat
char *strcat( char *strDestination, const char *strSource );
- 返回值是目標空間的首地址,所以進行引數保護是必要的
- 源字串必須以‘\0’結尾,並且strcat函式會將‘\0’一併連結到目標空間的尾部
- 目標空間必須是可變的
- 目標空間必須足夠放下源字串(注意包含‘\0’的長度)
char *my_strcat(char *strDestination, const char *strSource)
{
assert(strDestination && strSource); //檢查合法性
const char *src = (const char*)strSource; //保護引數
char *dest = (const char*)strDestination;
char *pdest = dest;
while (*pdest != '\0') // 找到目標空間的尾部,即目標空間'\0'的位置
{
pdest++;
}
while (*src != '\0') //在目標空間的'\0'位置連結
{
*pdest = *src;
src++;
pdest++;
}
*pdest = '\0'; //給目標空間結尾加字串結束標誌
return strDestination;
}
int main()
{
char str1[18] = { "abcdefghijk" };
char *str2 = "oooooo";
char *pdest = my_strcat(str1, str2);
printf("%s\n", pdest);
return 0;
}
Ohhhhhhhhhhhhhhhhhhhhhhhhhhh!!!!他…他合體了