strncmp && strstr使用+模拟实现

举报
芒果_Mango 发表于 2022/02/26 21:40:35 2022/02/26
【摘要】 strncmp() - 字符串比较函数strncmp的功能和strcmp的功能和相似,只不过多了一个参数用来确定比较的个数比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完int main(){ char arr1[] = "abcdef"; char arr2[] ="abcqw"; int ret = strncmp(arr1,arr2,3); //...

strncmp() - 字符串比较函数

image-20220207232008199

strncmp的功能和strcmp的功能和相似,只不过多了一个参数用来确定比较的个数

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完


int main()
{
    char arr1[] = "abcdef";
    char arr2[] ="abcqw";
    int ret = strncmp(arr1,arr2,3);	//0
    int ret2 =strncmp(arr1,arr2,4);	//-1
    printf("%d %d\n",ret,ret2);
}

count:要比较的前n个字符


模拟实现strncmp

思路:要比较前count个字符,当找到两个字符串指向的字符不相等时,跳出循环,解引用比较此时字符对应的ascii码值,

注意:比较的是\0之前的字符,若前count个字符中,提前遇到\0,且二者都是相等的,则返回0,所以要进行判断,

char* str1 = "abc\0def";
 char* str2 = "abc\0d";
int ret = my_strncmp(str1, str2, 6);
inr ret = strncmp(str1,str2,6);	//0 库函数就是返回0
int my_strncmp(char* dest, char* src, size_t count)
{
    assert(dest && src);
    //找到前count个字符中,不相等的字符
    while (count)
    {
        count--;
        //二者指向相等,继续往下找
        if (*dest == *src)
        {
            //若二者相等,且都是\0,则返回0
            if(*dest == '\0')
            {
                return 0;
            }
            dest++;
            src++;
        }
        else	//二者指向不相等,跳出循环
            break;
    }
    //跳出时,找到不想等的字符,或者二者相等
    return *dest - *src;
}
int main()
{
    char* str1 = "abcdef";
    char* str2 = "abcd";
    int ret = my_strncmp(str1, str2, 3);
    if (ret > 0)
    {
        printf("str1>str2\n");
    }
    else if (ret < 0)
    {
        printf("str1 < str2\n");
    }
    else
    {
        printf("str1= str2\n");
    }
    return 0;
}

简化:

比较的是\0之前的字符,所以while判断要加上*src 和*dest ,防止count大于长度,越界访问了

int my_strncmp(char* dest, char* src, size_t count)
{
    assert(dest && src);
    while (count-- && (*src == *dest) && *src && *dest)
    {
        ;
    }
    return *dest - *src;
}

strstr - 字符串查找函数

image-20220207232025136


在一个主字符串找查找子字符串,如果找到了,反正子字符串在主字符串的起始位置,找不到,则返回空指针

注意:返回的是第一次出现的位置


int main()
{
    char arr1[] = "abcdefabcd Mango";
    char arr2[] = "abcd";
    char* ret = strstr(arr1,arr2);
    if(ret == NULL)
    {
        printf("找不到\n");
    }
    else{
        printf("%s\n",ret);
    }
    return 0;  
}

打印结果:cabcd Mango

ret为子字符串第一次出现的起始地址


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。