算法随笔 - 判定一个字符串是否为另一个字符串的前串和后串

版权声明:QQ:763905926 未经允许请勿转载,转载请注明出处! https://blog.csdn.net/lms1008611/article/details/87451037

    19年的第一个周末,把上周在公司划水摸鱼偷偷写的一个小程序搬到博客上来,这里搬的是:判断一个字符串是否为另一个字符串的前串。 比方有个char str[] = "hello my 2019! keep moving!",那么给一个子串,假如为 char str1[] = "hello",我们要实现的就是判断 str1是否为str的前串,给定char str2[] = "moving!",判断str2是否为str的后串

    实现也比较简单,主要掌握好指针基本就没什么问题,当然也可以采用别的方式,这里我把这个功能模块放入一个命名空间中,使用时直接 命名空间::功能模块函数名  即可,下边就来看看这里是如何实现的

//LmsPublicLib.h头文件
#ifndef __LMSPUBLICLIB_H__
#define __LMSPUBLICLIB_H__

#include <stdio.h>
#include <unistd.h>
#include <string>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <assert.h>
#include <vector>

using namespace std;

#ifndef MAX_PATH
#define MAX_PATH 256
#endif

namespace LmsPublicLib
{
    bool HeadStrJuge(const char* OriStr, const char *HeadStr);//判断HeadStr是否为OriStr的前串
    bool TailStrJuge(const char* OriStr, const char *TailStr);//判断TailStr是否为OriStr的后串
};

#endif //__LMSPUBLICLIB_H__
//LmsPublicLib.cpp源文件
#include "LmsPublicLib.h"

namespace LmsPublicLib
{
    /*
    *  HeadStr是OriStr的前串,返回true,否则返回false
    */
    bool HeadStrJuge(const char* OriStr, const char *HeadStr)
    {
        if(!OriStr || !HeadStr || (strlen(HeadStr) > strlen(OriStr)) )
        {
            return false;
        }

        char OriStrArray[MAX_PATH] = {0};
        char HeadStrArray[128] = {0};

        strcpy(OriStrArray, OriStr);
        strcpy(HeadStrArray, HeadStr);
        OriStrArray[strlen(OriStrArray)] = '\0';
        HeadStrArray[strlen(HeadStrArray)] = '\0';
        int compareLen = 0;

        for(int i=0; '\0' != HeadStrArray[i]; i++)
        {
            if(HeadStrArray[i] != OriStrArray[i])
            {
                break;
            }
            compareLen++;
        }

       return compareLen == strlen(HeadStrArray);        
    }
    
    /*
    *  TailStr是OriStr的后串,返回true,否则返回false
    */
    bool TailStrJuge(const char* OriStr, const char *TailStr)
    {
        if(!OriStr || !TailStr || (strlen(TailStr) > strlen(OriStr)) )
        {
            return false;
        }
        

        char OriStrArray[MAX_PATH] = {0};
        char TailStrArray[128] = {0};

        strcpy(OriStrArray, OriStr);
        strcpy(TailStrArray, TailStr);
        OriStrArray[strlen(OriStrArray)] = '\0';
        TailStrArray[strlen(TailStrArray)] = '\0';

        char *pcOri = OriStrArray + strlen(OriStrArray) -1;
        char *pcTail = TailStrArray + strlen(TailStrArray) -1;

        int compareLen = 0;

        for(int i=strlen(TailStrArray)-1; i>=0; i--)
        {
            if(*(pcOri--) != *(pcTail--))
            {
                break;
            }
            compareLen++;
        }
        return compareLen == strlen(TailStrArray);
    }
}

下边来验证一下

#include "LmsPublicLib.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{

    char pszPath[256] = "hello my 2019! keep moving!";

    bool ret = LmsPublicLib::HeadStrJuge(pszPath, "hello");
    cout << "HeadStrJuge ret = " << ret << endl;

    ret = LmsPublicLib::TailStrJuge(pszPath, "moving!");
    cout << "TailStrJuge ret = " << ret << endl;

    return 0;
}

编译执行一下:

可以看到,结果符合我们的预期,当然,当输入的子串不是前串或后串时,输出的便是0,这里就不再演示了。

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/87451037