目录
1、strlen函数的使用与模拟实现
strlen是用来求字符串长度的函数,它的原型如下
size_t strlen( const char *string );
头文件为string.h
size_t表示返回的是无符号的整数,(字符串长度不可能是负数),string指向的是待求字符串首元素。
注意事项:
- 字符串必须以’\0’结束
- 返回值是size_t,是无符号的
strlen函数的使用
int main()
{
char arr[] = "abcdef";
size_t ret = strlen(arr);
printf("%zd\n", ret);
return 0;
}
输出结果:
strlen函数的模拟实现
方法1:计数器法
size_t my_strlen(const char*src)
{
size_t count = 0;
while (*src)
{
src++;
count++;
}
return count;
}
方法2:指针运算法
size_t my_strlen(const char* src)
{
char* p = src;
while (*src)
{
src++;
}
return src - p;
}
方法3:递归法
size_t my_strlen(const char* src)
{
if (*src == '\0')
{
return 0;
}
else
{
return 1+my_strlen(src+1);
}
}
2、strcpy函数的使用与模拟实现
strcp是字符串拷贝函数,原型如下
char* strcpy( char *dest, const char *src );
src指向的是源字符串,dest指向的是目标字符串,strcpy函数的作用是,把源字符串(src)拷贝到目标字符串(dest)。返回的是dest指向的字符串
注意事项
- 源字符串必须以’\0’结束
- 源字符串也会拷贝到目标字符串
- 目标空间必须足够大,确保可以存放源字符串
- 目标空间可修改
strcpy函数的使用
int main()
{
char arr1[20] = { 0 };
char arr2[] = "abcdef";
strcpy(arr1, arr2);
printf("arr1=%s\n", arr1);
return 0;
}
输出结果
strcpy函数的模拟实现
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
while (*src)
{
*(dest) = *(src);
dest++;
src++;
}
*(dest) = *(src);//将源字符串中的'\0'拷贝到目标字符串中
return ret;
}
3、strcat函数的使用与模拟实现
strcat是字符串追加函数,它的原型如下
char *strcat( char *dest, const char *src );
它的作用是将src指向的字符串(源字符串)追加到dest指向的字符串(目标字符串)中,什么是追加?
例如将src字符串"world"追加到dest字符串"hello " 中,追加后dest字符串结果是"hello world"
注意事项
- 目标字符串空间必须足够大,且必须以’\0’结束
- 源字符串必须以’\0’结束
- 目标空间可修改
strcat函数的使用
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
输出结果
strcat函数的模拟实现
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
while (*dest)
{
dest++;
}
while (*src)
{
*dest = *src;
dest++;
src++;
}
return ret;
}
4、strcmp函数的使用与模拟实现
原型:
int strcmp( const char *string1, const char *string2 );
strcmp函数是用于比较字符串是否相等的函数,如果相等返回0,如果string1大于string2返回大于0的数,如果小于则返回小于0的数。字符串是如何比较的?
我们来看一些例子
#include<stdio.h>
int main()
{
char arr1[] = "abcdeg";
char arr2[] = "abcdef";
printf("arr1与arr2比较:%d\n", strcmp(arr1, arr2));
char arr3[] = "bcd";
char arr4[] = "bcde";
printf("arr3与arr4比较:%d\n", strcmp(arr3, arr4));
char arr5[] = "bcde";
printf("arr4与arr5比较:%d\n", strcmp(arr4, arr5));
return 0;
}
输出结果:
我们可以发现比较的是对应位置上,字符的ASCII码值的大小
strcmp函数的模拟实现
int my_strcmp(const char* str1, const char* str2)
{
int ret = 0;
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else
{
return -1;
}
}
5、strncpy函数的使用与模拟实现
原型:
char *strncpy( char *strDest, const char *strSource, size_t count );
前两个参数和strcpy的参数是一样的,参数count表示要拷贝的字符个数,与strcpy不同的是,strncpy可以限制拷贝字符个数。
strncpy函数的模拟实现
char* my_strncpy(char* dest, const char* src, size_t num)
{
char* ret = dest;
while (num--)
{
*dest = *src;
dest++;
src++;
}
return ret;
}
6、strncat函数的使用与模拟实现
原型:
char *strncat( char *strDest, const char *strSource, size_t count );
前两个参数和strncat是一样的,count表示要追加的字符的个数,
strncat函数的模拟实现
char* my_strncat(char* dest, const char* src, size_t num)
{
char* ret = dest;
while (*dest)
{
dest++;
}
while (num--)
{
*dest = *src;
dest++;
src++;
}
return ret;
}
7、strncmp函数的使用与模拟实现
原型
int strncmp( const char *string1, const char *string2, size_t count );
前两个参数与strcmp一样,count表示比较前num个字符。
strncmp模拟实现
int my_strncmp(const char* str1, const char* str2,size_t num)
{
int ret = 0;
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2||num)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
num--;
}
if (*str1 > *str2)
{
return 1;
}
else
{
return -1;
}
}
8、strstr函数的使用与模拟实现
原型:
char *strstr( const char *string, const char *strCharSet );
strstr函数的功能是:如果string字符串中包含有strCharSet字符串,则返回第一次出现strCharSet字符串的位置(可能包含多个strCharSet字符串)。
strstr函数的模拟实现
char* my_strstr(const char* str1, const char*str2)
{
const char* cur = str1;
const char* s1 = NULL;
const char* s2 = NULL;
assert(str1 && str2);
if (*str2 == '\0')
{
return (char*)str1;
}
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;
}
BF算法
int BF(char* str1, char* str2)
{
size_t len1 = strlen(str1);
size_t len2 = strlen(str2);
int i = 0;//str1主串下标
int j = 0;//str2子串下标
while (i<len1 && j<len2)
{
if(str1[i] == str2[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >= len2)
{
return i - j;//找到了,返回下标
}
else
{
return -1;//找不到
}
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "def";
printf("%d\n", BF(arr1, arr2));
return 0;
}
9、strtok函数的使用
原型:
char * strtok ( char * str, const char * sep);
- sep参数指向⼀个字符串,定义了用作分隔符的字符集合
- 第⼀个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。
- strtok函数找到str中的下⼀个标记,并将其⽤ \0 结尾,返回⼀个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使⽤strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。)
- strtok函数的第⼀个参数不为 NULL ,函数将找到str中第⼀个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标记。
- 如果字符串中不存在更多的标记,则返回 NULL 指针。
例:
int main()
{
char arr[] = "192.168.6.111";
char* sep = ".";
char* str = NULL;
for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
{
printf("%s ", str);
}
return 0;
}
输出结果:
10、strerror函数的使用
原型:
char * strerror ( int errnum );
strerror函数返回发生错误对应的错误信息的字符串,errnum是错误码,错误码放在errno.h中
例如
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%s\n", strerror(i));
}
return 0;
}
输出结果:
完…