字符串函数
长度不受限制的字符串函数
#strcpy
#strcat
#strcmp
长度受限制的字符串函数
#strncpy
#strncat
#strncmp
字符串查找
#strstr
#strtok
strlen函数实现
三种实现方法
1.计数器方法
int my_strlen(const char *str)//计数器
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
2.不创建临时变量递归实现
int my_strlen( const char *str)//不能创建临时变量用了递归
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
3.指针减指针
int my_strlen(char *str)//指针减指针//返回的是两指针之间的元素个数
{
char *str2 = str;
while (*str2 != '\0')
{
str2++;
}
return str2 - str;
}
1) strlen函数的返回值是size_t 无符号数
2) strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )
3) 参数指向的字符串必须要以 ‘\0’ 结束
长度不受限制的字符串函数实现
strcpy 函数实现
char * my_strcpy(char *dest, const char *src)
{
char * ret = dest;
assert(dest&&src);
while ((*dest++ = *src++))
{
;
}
return ret;
}
1)保证目标空间必须足够大放得下相关的内容
2)目标空间可以被修改
//
strcat 函数实现
char * my_strcat(char * dest, const char * src)
{
assert(dest && src);
char * ret = dest;
while (*dest) //找到目标字符串中的‘\0’
{
dest++;
}
while (*dest++ = *src++) //将源头数据追加过去包括‘\0’
{
;
}
return ret; //返回值是目标空间的起始地址
字符串追加自己本身
char * my_strncat(char * str1, const char * str2, size_t num)
{
assert(str1&&str2);
char * ret = str1;
while (*str1)
{
str1++;
}
while (num--)
{
if ((*str1++ = *str2++) == 0)
return ret;
}
*str1 = '\0';
return ret;
}
int main()
{
char arr1[] = "hello ";
char arr2[] = "hello";
char * ret = my_strncat(arr1, arr2, 3);
printf("%s\n", ret);
return 0;
}
strcmp 函数的实现
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0') //如果是0直接返回退出
{
return 0;
}
s1++; //相等向后移动
s2++;
}
return *s1 - *s2;//s1 s2不相等直接返回两个元素的差值
实质上是ascll码值比较
}
比较大小,每个元素一一对应,相等向后走,与长度无关,只管比较两个元素的ascll码值的大小
长度受限制的字符串函数
strncmp 函数
int strncmp ( const char * str1, const char * str2, size_t num )
相对于strcmp 会相对安全 会考虑目标空间是否放得下
size_tnum限定个数长度
字符串查找函数实现
strstr 函数
在字符串中查找另一个字符串
将str1(包含要匹配的字符序列的字rst符串)的首元素地址与str2(要查找的字符串)对比,不相等str1向后移,直到str1元素与str2
元素相等,str2也一起向后移,并且当两个元素不匹配时找不到了,应该回退到上一次匹配开始的下一个位置
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = NULL; //记录最开始的起始位置
const char* s2 = NULL;
const char* sp = str1; //记录开始匹配的起始位置地址
if (*str2 == '\0')
{
return (char*)str1;
}
while (*sp)
{
s1 = sp;
s2 = str2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)sp;
}
sp++; //如果没找到就回退到上一次匹配开始的地址的下一个位置
}
return NULL;
}
strtok函数
切割字符串
char * strtok ( char * str, const char * delimiters )
delimiters 参数是个字符串,定义了用作分隔符的字符集合
例如" @ - . * " 自己指定设计
strtok第一次调用时传一个字符串,再次调用可传一个空指针过去。
找到第一个标记,更改,并且记录更改位置的地址,再调用strtok第一个参数为空指针时,从上一次保存好的位置开始,再进行寻找分隔符,并且改为\0,以此类推。
int main()
{
char arr1[] = "- This ,a sample .string";
char tmp [20] = { 0 };
const char * sep = "-,. ";
char * str = NULL;
strcpy(tmp, arr1);//由于strtok函数会改变原来字符串的内容,创建临时变量
for (str = strtok(tmp, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s\n", str);
}
//for循环初始化一次,刚好契合strtok函数传参第一次传有效地址
return 0;
}