strncmp && strstr使用+模拟实现

120 阅读2分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

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为子字符串第一次出现的起始地址