c语言常见的字符串函数
1.strlen——<string.h>
求字符串长度函数——strlen
字符串已经 ‘\0’ 作为结束标志,strlen
函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdef";
printf("%d", strlen(arr));
return 0;
}
模拟实现
//int my_strlen(const char * str) {
// int count = 0;
// while (*str)
// {
// count++;
// str++;
// }
// return count;
//}
int my_strlen(char *s) {
char *p = s;
while (*p != '\0')
p++;
return p - s;
}
int main()
{
char arr[] = "abcdef";
printf("%d", my_strlen(arr));
return 0;
}
2.strcpy——<string.h>
字符串比较函数——strcpy
源字符串必须以 ‘\0’ 结束。
会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变
int main()
{
char arr1[20] = "xxxxxxxxx";
char arr2[] = "hello";
strcpy(arr1,arr2);
printf("%s", arr1);
return 0;
}
模拟实现
char *my_strcpy(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[]="xxxxxxxx";
char arr2[]="abcd e";
char* ret=my_strcpy(arr1,arr2);
printf("%s",ret);
}
受限制的strncpy——<string.h>
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
int main()
{
char arr1[20] = "xxxxxxxxx";
char arr2[] = "abcde";
strncpy(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
3.strcat——<string.h>
字符串追加——strcat
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
模拟实现
char *my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest)
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
my_strcat(arr1, arr2);
printf("%s", arr1);
return 0;
}
受限制的strncat——<string.h>
如果源目标空间<要拷贝的字符个数,则补’\0’
int main()
{
char arr1[20] = "hello ";
char arr2[] = "wor";
strncat(arr1, arr2,5);
printf("%s", arr1);
return 0;
}
4.strcmp——<string.h>
字符串比较函数——strcmp
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
int ret = strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1>arr2");
}
else if (ret < 0)
{
printf("arr1<arr2");
}
else if (ret == 0)
{
printf("arr1=arr2");
}
}
模拟实现
int my_strcmp(const char * src, const char * dest)
{
int ret = 0;
assert(src != NULL);
assert(dest != NULL);
while ((*src - *dest)==0)
{
if (*dest == '\0')
{
return 0;
}
src++;
dest++;
}
return (int)*src - *dest;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
{
printf("arr1>arr2");
}
else if (ret < 0)
{
printf("arr1<arr2");
}
else if (ret == 0)
{
printf("arr1=arr2");
}
}
受限制的strncmp——<string.h>
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abczzz";
int ret = strncmp(arr1, arr2,3);
if (ret > 0)
{
printf("arr1>arr2");
}
else if (ret < 0)
{
printf("arr1<arr2");
}
else if (ret == 0)
{
printf("arr1=arr2");
}
}
5.strstr——<string.h>
寻找字符串中的子串——strstr
成功返回找到的第一个元素的地址
失败返回null
int main()
{
char arr1[] = "abbbbccddeff";
char arr2[] = "cdde";
char* ret=strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
模拟实现
char* my_strstr(const char * str1, const char * str2)
{
char *cp = (char*)str1;
char *s1 = (char*)str1;
char* s2 = (char*)str2;
while(*cp)
{
s1 = cp;
s2 = (char *)str2;
while (*s1 && *s2 && (*s1==*s2))
{
s1++;
s2++;
}
if (*s2=='\0')
return cp;
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbbccddeff";
char arr2[] = "cdde";
char* ret=my_strstr(arr1, arr2);
printf("%s", ret);
return 0;
}
6.strtok——<string.h>
char * strtok ( char * str, const char * sep );
分解字符串——strtok
sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
记。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串
中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标
记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
int main()
{
char str[] = "- This, a sample string.";
char * pch;
pch = strtok(str, " ,.-");
printf("%s\n", pch);
printf("%s\n", strtok(NULL, " ,.-"));
printf("%s\n", strtok(NULL, " ,.-"));
printf("%s\n", strtok(NULL, " ,.-"));
return 0;
}
7.strerror——<string.h><errno.h>
返回错误信息——strerror
#include<errno.h>
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
printf("%s\n", strerror(5));
}
8.memcpy——<string.h>
内存复制的函数——memcpy
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
int main()
{
char arr1[20] = "xxxxxxx";
char arr2[] = "abcdfe";
memcpy(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
模拟实现
void * my_memcpy(void * dst, const void * src, size_t count)
{
void * ret = dst;
assert(dst);
assert(src);
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
int main()
{
char arr1[20] = "xxxxxxx";
char arr2[] = "abcdfe";
my_memcpy(arr1, arr2, 3);
printf("%s", arr1);
return 0;
}
9.memmove——<string.h>
内存移动的函数——memmove
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
memmove(arr,arr+6,sizeof(int)*4);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
模拟实现
void* my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest);
assert(src);
if (dest < src)
{
while(num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
my_memmove(arr,arr+6,sizeof(int)*4);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
10.memcmp——<string.h>
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
内存比较的函数——memcmp
比较从ptr1和ptr2指针开始的num个字节
int main()
{
char buffer1[] = "abcdefg";
char buffer2[] = "abcdEFG";
int n=memcmp(buffer1, buffer2, sizeof(buffer1));
if(n>0)
printf("bufder1>buffer2");
else if(n<0)
printf("bufder1<buffer2");
else
printf("bufder1=buffer2");
return 0;
}
11.memset——<string.h>
字符串内存设置函数——memset
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
memset(arr,0,sizeof(int)*10);
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
感谢观看!!!