本次分享了各种字符串函数的使用和部分模拟实现 ,希望能对你有所帮助。
strlen:求字符串的长度
模拟实现:
int my_strlen(const char* str)
{
assert(str);//记得加上断言,防止对NULL的访问,养成好习惯
int count = 0;
while (*str++)
{
count++;
}
return count;
}
strcmp:字符串的大小比较
函数原型:int strcmp( const char *string1, const char *string2 );
规则:从两个字符串的第一个字符开始比较,相等则继续,若同时为‘\0’则返回0值,若不同,当string1位置比string2位置的大时,返回一个大于0的数,小于则返回负数
模拟实现:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)//相同则继续
{
if (*str1 == '\0')//如同时为'\0',返回0
return 0;
str1++;
str2++;
}
return *str1 - *str2;//两字符的ascii码之差
}
strncmp:比较字符串,可以指定比较字符个数
int my_strncmp(const char* str1, const char* str2, int count) { //比较count个字符串的长度 //若count大于str2中字符的个数,则比较完整的字符串 while (count--) { if (*str1 == *str2) { if (*str1 == '\0') return 0; if (count == 0) break; str1++; str2++; } else { break; } } return *str1 - *str2; }
strcat:字符串追加函数
函数原型:char *strcat( char *dst, const char *src );
将字符串src的内容从dst的‘\0’开始(会覆盖)拷贝到dst中
模拟实现:
char* my_strcat(char* dst, const char* src)
{
assert(dst && src);
char* ret = dst;
while (*dst)
{
dst++;//找‘\0’
}
while (*dst++ = *src++)//注意是赋值,当src指向'\0'时终止
{
;
}
return ret;
}
strncat:追加指定个数的字符
char *strncat( char *dst, const char *src, int count );
使用:
int main()
{
char arr1[20] = "hello ";
char* arr2 = "abcdef";
printf("%s", strncat(arr1, arr2,2));
return 0;
}
运行如下:
strstr:在字符串寻找相同的字串
char *strstr( const char *str, const char *set );
返回找到的第一个子串的首地址,若未找到,返回NULL
使用:
模拟实现:
char* my_strstr(const char* str, const char* set)
{
const char* cur = str;
const char* s1 = str;
const char* s2 = set;
while (*cur)//cur记录当前字符串的首地址
{
s1 = cur;
while (*s1 && *s2 && (*s1 == *s2))//当某个字符串走到‘\0’或者两者不同,比较结束
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)cur;
cur++;//从下个位置开始找
s2 = set;//s2重置
}
return NULL;
}
strtok
//strtok库函数的使用(string.h)
//char *strtok( char *strToken, const char *strDelimit );
//strDelimit是用作分割符的字符集合
//strToken指向一个字符串,它包含了0个或多个strDelimit中的间隔字符
//strtok函数指向下一个标记(间隔字符的位置)返回这个标记前的字符串的首地址(间隔符会被置为'\0')
//当参数strToken不为NULL时,strtok中将记住第一个分隔符的位置
//当参数为NULL时,strtok会从被保留的位置开始找到下一个标记
//注意:strtok会将strToken改变,所以使用该函数时,我们常常对原串进行拷贝使用,以防修改原串
// 若找不到标记,返回NULL
//int main()
//{
// char arr1[] = "adsadafgc&dasd@dsd";
// char arr2[100] = { 0 };
// strcpy(arr2, arr1);
// char* sep = "&@";
// char* x = 0;
// //找到第一个标记后打印,之后分别打印
// for (x = strtok(arr2, sep); x != NULL; x = strtok(NULL, sep))
// {
// printf("%s\n", x);
// }
// return 0;
//}
strerror:错误信息的打印
//strerror的使用
//作用:将对应错误码的错误信息打印出来
//errno:当前错误码
//int main()
//{
// int* arr = (int*)malloc(INT_MAX);//申请开辟空间过大返回NULL
// if (arr == NULL)
// {
// printf("%s\n", strerror(errno));
// }
// return 0;
//}
memcpy:将指定位置指定字节大小的内容拷贝到另一处
//memcpy
//void *memcpy( void *dest, const void *src, size_t count );
//将src位置后count个字节的内容拷贝到dest中
//void* my_memcpy(void* dest, const void* src, int count)
//{
// assert(dest && src);
// void* ret = dest;
// while (count--)
// {
// *(char*)dest = *(char*)src;
// (char*)dest = (char*)dest + 1;
// (char*)src = (char*)src + 1;
// }
//
// return ret;
//}
strncpy:字符串拷贝 :指定大小
//strncpy拷贝count个字符给目的串
//当count大于src长度时,不足的用'\0'补齐
char* my_strncpy(char* dst, const char* src, int count)
{
assert(dst && src);
char* ret = dst;
while (count--)
{
*dst = *src;
if (*src == '\0')
{
*dst = *src;
dst++;
}
else
{
dst++;
src++;
}
}
return ret;
}