目录
1.strlen
2.strcpy
3.strcmp
4.strcat
5.strstr
6.strncpy,strncat,strncmp
7.strtok
1.strlen
定义:
size_t strlen ( const char * str );
使用:
int main()
{
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
return 0;
}
模拟实现:
size_t my_strlen(const char*str)
{
assert(str != NULL);
int count = 0;
while (*str++)
{
count++;
}
return count;
}
注意事项:
1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。
2.参数指向的字符串必须要以 '\0' 结束。
3.注意函数的返回值为size_t,是无符号的( 易错 )
2.strcpy
定义:
char * strcpy ( char * destination, const char * source );
使用:
int main()
{
char arr[20] = "*******";
char arr1[] = "hello!";
strcpy(arr, arr1);
printf("%s\n", arr);
return 0;
}
模拟实现:
char*my_strcpy(char*dst, const char*src)
{
assert(dst&&src);
char*temp = dst;
while (*dst++ = *src++)
{
;
}
return temp;
}
注意事项:
1.源字符串必须以 '\0' 结束。
2.会将源字符串中的 '\0' 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变
3.strcmp
定义:
int strcmp ( const char * str1, const char * str2 );
使用:
int main()
{
char arr1[] = "abc";
char arr2[] = "abcd";
int ret=strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}
模拟实现:
int my_strcmp(const char*str1, const char*str2)
{
assert(str1&&str2);
while (*str1==*str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else
return -1;
}
注意事项:
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
4.strcat
定义:
char * strcat ( char * destination, const char * source );
使用:
int main()
{
char arr1[20] = "hello ";
char arr2[] = "bit";
printf("%s\n", strcat(arr1,arr2));
return 0;
}
模拟实现:
int my_strcat(char*dst, const char*src)
{
assert(dst&&src);
char*temp = dst;
while (*dst)
{
dst++;
}
while (*dst++=*src++)
{
;
}
return temp;
}
注意事项:
1.源字符串必须以 '\0' 结束。
2.目标空间必须有足够的大,能容纳下源字符串的内容。
3.目标空间必须可修改。
4.字符串不可自己给自己追加,因为会覆盖‘\0’,产生死循环。
5.strstr
定义:
char * strstr ( const char *, const char * );
使用:
int main()
{
char arr1[20] = "hello bithyuhuy ";
char arr2[] = "bit";
printf("%s\n", strstr(arr1,arr2));
return 0;
}
模拟使用:
char*my_strstr(const char*str1, const char*str2)
{
assert(str1&&str2);
char*s1 = (char*)str1;
char*s2 = (char*)str2;
char*sp = (char*)str1;
while (*sp)
{
s1 = sp;
s2 = (char*)str2;
while (*s1&&*s2&&*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return sp;
}
sp++;
}
return NULL;
}
6.strtok
定义:
char * strtok ( char * str, const char * delimiters );
使用:
int main()
{
char arr1[] = "huyunhu@qq.com";
const char*str = "@.";
char arr2[20] = { 0 };
strcpy(arr2, arr1);
char*temp = NULL;
for (temp = strtok(arr2, str); temp != NULL; temp = strtok(NULL, str))
{
printf("%s\n", temp);
}
return 0;
}
7.strncpy,strncat(长度受限制字符串函数)
定义:
strncpy: char * strncpy ( char * destination, const char * source, size_t num );
strncat: char * strncat ( char * destination, const char * source, size_t num );
使用:
strncpy:
int main()
{
char arr1[20] = { 0 };
char arr2[] = "abcdefg";
strncpy(arr1, arr2, 6);
printf("%s\n", arr1);
return 0;
}
结果为:abcdef
当源字符串中字符个数,不够我们要操作的字符数时:dst数组会用额外的NUL字节填充到len长度。
//int main()
//{
//
// char arr1[20] = "hello ";
// char arr2[]="bit";
//
// strncpy(arr1, arr2,6);
// printf("%s\n", arr1);
//
// return 0;
//}
strncat:(分析与strncpy的区别)
int main()
{
char arr1[20] = "hello \0######";
char arr2[]="bit";
strncat(arr1, arr2,3);
printf("%s\n", arr1);
return 0;
}
追加后,会多追加一个'\0';
int main()
{
char arr1[20] = "hello \0######";
char arr2[]="bit";
strncat(arr1, arr2,6);
printf("%s\n", arr1);
return 0;
}
当操作数大于源字符串的长度时,不会像strncpy那么填充,还是只追加源字符串以及‘\0’;