C语言字符函数和字符串函数
1.strlen函数
功能:计算字符串长度,不包含’\0’
返回值:返回字符串的字符数
注意:
- strlen() 函数计算的是字符串的实际长度,遇到第一个’\0’结束;
- 参数指向的字符串必须以 ’ \0 ‘结束
- 函数返回值一定是size_t ,是无符号的
- 如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止
- sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数
方法1
//size_t 就是 unsigned int
size_t my_strlen(const char* str)
{
assert(str != nullptr);
int count = 0;
while (*str++!='\0')
{
//*str++;//跟while循环里面的*src++等价
count++;
}
return count;
}
方法2
size_t my_strlen(const char* str)
{
assert(str != nullptr);
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
//递归,(str+1)相当于str++,再次进入函数str从第二个字符开始计算
}
else
{
return 0;
}
}
方法3
size_t my_strlen(const char* str)
{
assert(str != nullptr);
char* start = (char*)str;
while (*str !='\0')
{
str++;
}
return str - start;
}
2,strcpy函数
功能:把src里面的字符复制到dest里面
注意:
- 源字符串必须以’\0’结束
- 会将源字符串的’\0’拷贝到目标空间
方法1
返回值:无返回值
void my_strcpy(char* dest, const char* src)
{
assert(dest != nullptr && src != nullptr);
//while (*src!='\0')
//{
// *dest++ = *src++;
//}
while (*dest++ = *src++);//与上面while循环等价
*dest = '\0';
}
方法2
返回值:返回参数dest的字符串起始地址
//为了实现链式访问 要char*类型的返回值
//把一个函数的返回值当成另一个函数的参数就是链式访问
char* my_strcpy(char* dest, char* src)//可实现递归
{
assert(dest != nullptr && src != nullptr);
char* p = dest;
while (*src!='\0')
{
*p++ = *src++;
}
*p = '\0';
return dest;
}
3.strcmp
功能:字符串比较
返回值:若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
方法1
int my_strcmp(const char* first, const char* second)
{
assert(first!=nullptr && second!=nullptr);
while (*first !='\0' && *second !='\0')
{
if (*first != *second)
{
break;
}
first++;
second++;
}
return *first - *second;
}
方法2
int my_strcmp(const char* first, const char* second)
{
assert(first!=nullptr && second!=nullptr);
int k = 0;
while ((k = *first - *second) == 0
&& *first++ && *second++);
return k;
}