strlen()
详解
.函数返回类型:size_t 无符号整形 因为字符串长度
不可能为负数。
.参数:一个字符串
函数模型:size_t strlen(const char *str);
作用
求字符串的长度。由于字符串以’\0‘作为结束标志
,strlen函数返回的是在字符串中'\0'前面出现的
字符个数(不包括‘\0')。
使用注意事项
.参数指向的字符串必须要以’\0‘结束。
.注意函数的返回值为size_t,是无符号的(易错)
模拟实现
第一种方式
//指针-指针的方式
int my_strlen(char* a)
{
assert(a);
char* p = a;
while (*p != '\0')
{
p++;
}
return p - a;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
第二种
//不能创建临时变量计时器
int my_strlen(const char* a)
{
assert(a);
if (*a == '\0')
return 0;
else
return 1 + my_strlen(a + 1);
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
第三种方式
int my_strlen(const char* arr)
{
int count = 0;
assert(arr);
while (*arr);
{
count++;
arr++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
strcpy()
详解
.函数模型:char *strcpy(char *str1,const char *str2);
.参数:目标字符串和被拷贝字符串
作用及注意事项
.字符串拷贝,将字符串str2的内容拷贝到字符串str1中
.原字符串必须以’\0'结束。
.会将原字符串中的‘\0'拷贝到目标空间。
目标空间必须足够大,以确保能存放原字符串。
目标空间必须可变。
模拟实现
char * my_strcpy(char* dest,const char *str)
{
char* ret = dest;
assert(dest);
assert(str);
while (*dest++ = *str++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "****************";
char arr2[] = "abcd";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
strcat()
详解
.函数模型:char* strcat(char *str1, const char *str2);
作用机注意事项
.将字符串str2追加到字符串str1后面
.原字符串必须以’\0'结束。
.目标字符串中也得有‘\0',否则没办法知道追加从哪里开
始。
.目标空间必须足够大,能容纳下原字符串的内容。目标空
间必须可修改。
模拟实现
char* my_stract(char* dest, const char* src)
{
assert(dest);
assert(src);
char* p = dest;
//找到\0;
while (*++dest)
{
;
}
//追加字符串
while (*dest++ = *src++)
{
;
}
return p;
}
int main()
{
char str1[20] = "abcd";
char str2[] = "efg";
my_stract(str1, str2);
printf("%s\n", str1);
return 0;
}
还有strncat()函数相比较于strcat函数多了一个参数是可以控制追加的数量
strcmp()
详解
.函数模型:int strcmp(const char*string1,const char*string2)
作用及注意事项
.比较字符串大小内容(不是长度)(ASCLL值),若string1>string2,返回一个大于0的数,若string1=string2,
返回0,若string1<string2,返回小于0的数。
模拟实现
int my_strcmp(const char* str1, const char* str2)
{
int ret = 0;
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char str1[] = "bcd";
char str2[] = "bcg";
int ret = my_strcmp(str1, str2);
printf("%d", ret);
return 0;
}
strncmp()函数
.同上个函数相同,比strcmp()函数多了一个参数,比
较的个数。
strstr()
详解
.函数模型:char*strstr(const char*str,const char*arr)
作用
.字符串查找函数,如果字符串arr在字符串string中,
返回第一次出现的位置的指针,若不在string中,则
返回空指针。
模拟实现
//strstr函数的模拟实现
char* my_strstr(const char* arr1, const char* arr2)
{
//断言
assert(arr1);
assert(arr2);
char* p1;
char* p2;
char* cp = arr1;//记录可能成功的值;
while (*cp != '\0')
{
p1 = cp;
p2 = arr2;
//while(*p1&&*p2&&*p1==*p2)
while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
{
p1++;
p2++;
}
if (!*p2)
return cp;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "I am a good boy";
char arr2[] = "good";
char* ret = my_strstr(arr1, arr2);
printf("%s\n", ret);
return 0;
}
strtok()
详解
函数模型:char * strcok(char *str, const char * sep);
作用及注意事项
strtok()是用来切割字符串的
.sep参数指向一个字符串,定义了用作分隔符的字符集合
.第一个参数指定一个字符串,他包含了0个或者多个由
sep字符串中一个或多个分隔符分割的标记。
.strtok函数找到str中的下一个标记,并将其用’\0'结尾
,返回一个指向这个标记的指针。
.strtok函数的第一个参数不为NULL,函数将找到str中的第
一个标记,strtok函数将保存他在字符串的位置
.strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
实现使用strtok
int main()
{
char arr1[] = "3103665181@qq.com.html";
char arr2[100] = { 0 };
strcpy(arr2, arr1);
char sep[] = "@.";
char* ret = NULL;
for (ret = strtok(arr2, sep); ret != NULL; ret = strtok(NULL, sep))
{
printf("%s\n", ret);
}
/*strtok(arr2, sep);
strtok(NULL, sep);*/
return 0;
}
写到这里还没完全写完函数 还有其他字符串函数 如果有问题欢迎讨论
感谢大家的支持 希望我们在编程的道路上越走越远 越来越精彩!!!