目录
一. strcmp
初学这个函数的时候可能有误区,以为比较的是字符串长度,实则不然,strcmp比较的是字符的ascii码值,在vs编译器中,第一个字符大于第二个字符,就>0;小于第二个字符,就<0;
第一个字符等于第二个字符,就=0,相等就比较下一个字符,依此递推。
int strcmp( const char *string1, const char *string2 );
1.参数说明
string1和string2为两个要比较的字符串,返回一个int值。
2.代码实现
int my_strcmp(const char* str1, const char* str2)
{
assert(str1&&str2);//断言,NULL指针直接失败
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
/*if (*str1 > *str2)
return 1;
else
return -1;*/
//简化
return (*str1 - *str2);
}
int main()
{
const char* str1 = "abcdef";
const char* str2 = "aqwer";
//利用库函数int ret = strcmp(str1, str2);//实际比的不是长度,而是比的字符ascii码值
int ret=my_strcmp(str1,str2);
//a=s,那么往后比较
printf("%d\n", ret);//linux -gcc操作系统中当是>0 返回>0;当时=0,返回0;当是<0,返回<0
//判断要>,=,<0
return 0;
}
二.strncmp
1.指定前n个字符进行比较,不受'\0'的限制,需要输入三个参数,
int strncmp( const char *string1, const char *string2, size_t count );
string1和string2两个要比较的字符串和要比较count个字符。
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strncmp(char* str1, char* str2, size_t count)
{
assert(str1 && str2);//断言
while (*str1 == *str2 && count)//简化语句
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
count--;
}
if (count == 0)//此处说明已经前几个相同了。
{
return 0;
}
if (*str1 > *str2)
return 1;
else if (*str1 < *str2)
return -1;
else
return 0;
}
int main()
{
char str1[] = "abddd";
char str2[] = "abd";
int ret =my_strncmp(str1, str2, 4);
printf("%d\n", ret);
return 0;
}
三.strcpy
1.字符串拷贝
char *strcpy( char *strDestination, const char *strSource );
把一个字符串拷贝到另一个字符串,结束以'\0'为标识。需要注意的是目的地空间应该大于起始。
2.代码实现
char* my_strcpy(char* dest, const char* sry)
{
assert(dest && sry);
char* start = dest;//返回起始位置
while (*sry != '\0')
{
*dest = *sry;
dest++;
sry++;
}
if (*sry == '\0')
*dest = '\0';
return start;
}
int main()
{
char arr1[] = "bit";
char arr2[] = "hello world";
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}
四.strncpy
1.拷贝num个字符从源字符串到目标空间,不过在笔者看来,这个库函数并不能让人满意,主要是因为看图::
相信大家可以看到,我只想拷贝bitb到arr2,而这是因为库函数没有进行追加'\0'.笔者自我实现一个函数,(说不定是笔者浅薄,无法理解库函数深意),实现只要num个字符拷贝。
2.代码实现
#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* sry, int count)
{
assert(dest && sry);
char* start = dest;
while (count&&(*dest++=*sry++))//凝炼成这么一个短句真是精妙
{
count--;
}
if (count!='\0')
{
while (--count)//因为是先执行上个while条件句再判断,故count在上个while语句未减1,而执行了*dest++=*sry++,所以应该前置--
{
*dest++ = '\0';
}
}
else
*dest='\0';//加上这么一句话就可以弥补库函数的瑕疵
return start;
}
int main()
{
char arr1[] = "bit";
char arr2[] = "abcedfg";
my_strncpy(arr2, arr1, 5);//需要注意目的地数组的空间应该大于等于要拷贝的长度
printf("%s\n", arr2);
return 0;
}
五.strncat--字符串追加
1.在dest末尾追加num个字符,注意目的地空间要够大,追加最后在后面补个'\0'.
char *strncat( char *strDest, const char *strSource, size_t count );
2.代码实现
#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* sry, int count)
{
assert(dest && sry);
char* start = dest;
while (*dest != '\0')
{
dest++;
}//直接到代码末尾
while (count&&(*dest++=*sry++))
{
count--;
}
if (count)//说明sry已经到'\0'
{
while (--count != 0)\\这个前置--挺好玩
{
*dest++ = '\0';
}
}
else
*++dest = '\0';
return start;
}
int main()
{
char arr1[30] = "hello";
char arr2[] = "world";//时候会在后面补个'\0',如果追加的个数长于源字符串,那么就打印源字符串
my_strncat(arr1, arr2, 2);//追加的
printf("%s\n", arr1);
return 0;
}
六.strstr--字符串查找
1.函数
1、strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
2、找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;
3、如果未找到所搜索的字符串,则返回NULL。
char *strstr(const char *dest, const char *sry);
dest: 被查找目标
sry: 要查找对象.
2.函数实现
char* my_strstr(const char* dest, const char* sry)
{
assert(dest && sry);
const char* dest1 = dest;
const char* sry1= sry;
const char* tmp = dest;//设两个dest的替换,一个用于判断,一个用于跳出循环
while (*tmp)
{
dest1 = tmp;
sry1 = sry;//如果不等,那么再次循环时dest1要往后查找,所以要赋tmp,而sry1则还是在首地址
while (*dest1 && *sry1 && (*dest1 == *sry1))
{
*dest1++;
*sry1++;
}
if (*sry1 == '\0')
{
return (char*)tmp;//找到子串并返回要第一次匹配字符串的地址
}
if (*dest1 == '\0')//一直到查完dest都没找到
{
return NULL;
}
tmp++;
}
}
int main()
{
const char*str1="bbc";
const char*str2="bcbbcdef";
char* ret =my_strstr(str2,str1);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
printf("找到子串:%s\n", ret);
return 0;
}
以上是笔者初学C的一些字符串库函数实现的代码。有几个是笔者自己敲构造的,在编译过程中没有出现问题。如果有问题,劳烦各位大佬指教啊。🌹