1. 求字符串长度
strlen
2. 长度不受限制的字符串函数
strcpy
strcat
strcmp
3. 长度受限制的字符串函数介绍
strncpy
strncat
strncmp
4. 字符串查找
**strstr
**
**
1. 函数介绍
**1.1 strlen**
size_t strlen ( const char * str );
注意事项:
字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束
注意函数的返回值为size_t,是无符号的,如下图所示:
int main()
{
if (strlen("abcd") - strlen("abcdefg")>0) //注意函数的返回值为size_t,是无符号的( 易错 )3-6=-3 ,返回的是3
printf(">\n");
else
printf("<\n");
return 0;
}
模拟实现如下:
size_t my_strlen(const char* str)
{
assert(str);
const char* start = str;
const char* end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}
int main()
{
char arr[] = "abcdefg";
int len = my_strlen(arr);
printf("%d ", len);
return 0;
}
1.2 strcpy
**
char * strcpy ( char * destination, const char * source );
注意事项:
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变
举例如以下代码:
int main()
{
char arr[10] = "abcdefg";
//const char* p = "zxy";
// char arr2[] = "zxyzx";
char arr3[] = { 'a','\0' ,'b','c'}; //输出a
strcpy(arr, arr3);
printf("%s\n", arr);
return 0;
}
模拟实现如下:
char* my_strcpy(char* arr1, const char* arr2)
{
assert(arr1);
assert(arr2);
char* ret = arr1;
while (*arr1++ = *arr2++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "hello world";
//char* arr2 = "hello world";
// my_strcpy(arr1, arr2);
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
1.3 strcat
char * strcat ( char * destination, const char * source );
注意事项:
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
不能实现自己给自己追加(重要!)
举例如下:
int main()
{
char arr1[20] = "abcde \0fg";
char arr2[] = "zxzx";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟实现如下:
char* my_strcat(char* arr1, const char* arr2)
{
//1.找到目标空间的\0
char* ret = arr1;
while (*ret != '\0')
{
ret++;
}
//2.拷贝到源头数据的\0之后
while (*ret++ = *arr2++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abcde \0fg";
char arr2[] = "zxzx";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
1.4 strcmp 比较的是对应位置上字符的大小,而非长度
int strcmp ( const char * str1, const char * str2 );
标准如下:
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
模拟如下:
int my_strcmp(const char* arr1, const char* arr2)
{
assert(arr1 && arr2);
while (*arr1 == *arr2)
{
if (*arr1 == '\0')
{
return 0;
}
arr1++;
arr2++;
}
/* if (*arr1 < *arr2)
return -1;
else
return 1;*/
return *arr1 - *arr2;
}
int main()
{
char arr1[] = "abced";
char arr2[] = "bcaaf";
//char arr1[] = "abc";
//char arr2[] = "abc";
/* char arr1[] = "abc";
char arr2[] = "aba";*/
int ret= my_strcmp(arr1, arr2);
if (ret < 0)
printf("arr1<arr2\n");
else if (ret > 0)
printf("arr1>arr2\n");
else
printf("arr1==arr2\n");
printf("%d\n", ret);
}
1.5 strncpy
char * strncpy ( char * destination, const char * source, size_t num );
注意事项:
1.拷贝num个字符从源字符串到目标空间;
2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
实现如下:
strncpy
char* strncpy(char* destination, const char* source, size_t num);
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "xxxx";
strncpy(arr1, arr2,4);
printf("%s\n", arr1);
return 0;
}
1.6 strncat
char * strncat ( char * destination, const char * source, size_t num );
注意事项:
从字符串追加字符将源的第一个数字字符追加到目标,外加一个终止空字符。
如果源中 C 字符串的长度小于num,则仅复制终止空字符之前的内容。
实现如下:
int main()
{
char arr1[20] = "ab\0cd";
char arr2[] = "xxxx";
strncat(arr1, arr2, 5);
printf("%s\n", arr1);
return 0;
}
自己给自己追加
int main()
{
char arr1[20] = "abcd";
strncat(arr1, arr1, 5);
printf("%s\n", arr1);
return 0;
}
1.7 strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
注意:
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完
实现如下:
int main()
{
char arr1[20] = "abc";
char arr2[] = "abce";
int ret= strncmp(arr1, arr2, 4);
printf("%d\n", ret);
return 0;
}
1.8 strstr
const char * strstr ( const char * str1, const char * str2 );
char * strstr (char * str1, const char * str2 );
注意事项:
查找子字符串
1.返回指向str1 中第一次出现的 str2 的指针,如果str2 不是str1 的一部分,则返回一个空指针。
2.匹配过程不包括终止空字符,但它到此为止
实现如下;
char* my_strstr(const char* str1, const char* str2)
{
const char* s1 = str1;
const char* s2 = str2;
if (*str2== '\0')
{
return str1;
}
const char* p = str1;
while (*p)
{
s1 = p;
s2 = str2;
if (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)p;
}
p++;
}
return NULL;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
char* p = my_strstr(arr1, arr2);
if (p == NULL)
{
printf("不存在\n");
}
else
{
printf("%s\n", p);
}
return 0;
}