一.strlen()函数:
size_t strlen ( const char * str );
求字符串长度;
- 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
- 参数指向的字符串必须要以 ‘\0’ 结束。
- 注意函数的返回值为size_t,是无符号的( 易错 )
注意:sizeof 与 strlen的区别:
int main()
{
char *ptr = "hello world";
cout << sizeof(ptr) << endl;//4 //指针大小都为4个字节
cout << strlen(ptr) << endl;//11
char arr[] = "hello world";
cout << sizeof(arr) << endl;//12 存在‘\0’;
cout << strlen(arr) << endl;//11
char arr1[] = {'a','s','d','f','g' };
cout << sizeof(arr1)/sizeof(char) << endl;//5
cout << strlen(arr1) << endl;//27 出现错误,没有‘\0’;
char arr2[] = { 'a', 's', 'd', 'f', 'g' ,'\0'};
cout << strlen(arr2) << endl;
return 0;
}
- strlen计算的是字符串到’\0’位置的大小
- sizeof计算的字符串占的内存大小
模拟实现strlen函数:
#include<stdio.h>
//size_t my_strlen(char* str)//递归实现
//{
// while (*(str) != '\0')
// {
// return 1 + my_strlen(str + 1);
// }
// return 0;
//}
//
//size_t my_strlen(char* str)//指针-指针
//{
// char* pt = str;
// while (*(pt) != '\0')
// pt++;
// return pt-str;
//}
size_t my_strlen(char* str)//临时变量
{
size_t count = 0;
while (*(str) != '\0')
count++;
return count;
}
int main()
{
char* ptr = "hello world";
size_t len = my_strlen(ptr);
printf("len = %d", len);
return 0;
}
二.strcap()函数:
char* strcpy(char * destination, const char * source );
字符串拷贝函数
- Copies the C string pointed by source into the array pointed by destination, including the terminating null
character (and stopping at that point). - 源字符串必须以 ‘\0’ 结束。
- 会将源字符串中的 ‘\0’ 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
模拟实现strcap()函数:
#include<stdio.h>
char* my_strcpy(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while ((*dest++ = *src++))
;
return ret;
}
int main()
{
char* ptr = "hello world!";
char arr[100] = "";
my_strcpy(arr,ptr);
printf("arr: %s", arr);
return 0;
}
(三)strcat()函数:
char* strcat(char * destination, const char * source );
连接字符串
将源字符串的副本附加到目标字符串。
目标中终止的空字符将被source的第一个字符覆盖,
并且在目标中两个字符的串联所形成的新字符串的末尾将包含一个空字符
- 源字符串必须以 ‘\0’ 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改
char *my_strcat(char *dest, const char *src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while (*dest!='\0') //寻找到目标字符串的'\0'位置
{
dest++;
}
while (*dest++ = *src++); //拷贝过程与strcpy相同
return ret;
}
int main()
{
char* ptr = "hello world!";
char arr[100] = "asd";
my_strcat(arr, ptr);
printf("arr: %s", arr);
return 0;
}
(四)strcmp()函数:
int strcmp ( const char * str1, const char * str2 );
判断字符串大小函数
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
- 那么如何判断两个字符串?
int strcmp(const char* dest,const char* src)
{
assert(dest);
assert(src);
while ((*dest != '\0') && (*src == *dest))
{
dest++;
src++;
}
return *dest - *src;
}
int main()
{
char *str1 = "hello world";
char *str2 = "hello xian";
int res = strcmp(str1, str2);
if (res > 0)
printf("str1>str2");
else if (res == 0)
printf("str1=str2");
else
printf("str1<str2");
return 0;
}
常用的字符串操作函数就这些,还有很多有兴趣可以尝试实现实现。