天天看點

模拟實作字元串相關函數

一、題目

1、求字元串長度。

2、字元串拷貝。

3、字元串連接配接。

4、字元查找函數。

5、字元串查找函數。

二、代碼:

//編寫一個my_strlen函數,他類似于strlen函數,但是他能夠處理由于使用strn--函數而建立的未能以null位元組結尾的字元串。
int my_strlen(char *str,int n)  //求字元串長度
{
    int lenth = 0;
    while (lenth<n)
    {
        if (*(str++) == '\0')
            break;
        ++lenth;
    }
    return lenth;
}

//編寫一個my_strcpy函數,它類似于strcpy函數,但他不會溢出目标數組。複制的結果必須是一個真正的字元串
void my_strcpy(char *dst,char const *src,int n) //字元串拷貝函數(n是原字元串的長度)
{
    while (--n) //n控制溢出
    {
        if (*src == '\0')
            break;
        *(dst++) = *(src++);
    }
    *dst='\0';
}

//編寫一個my_strcat函數,它類似于strcat函數,但他不會溢出目标數組。複制的結果必須是一個真正的字元串
void my_strcat(char *dst,char const *src,int n)//字元串連接配接(n為原字元串的長度,控制原字元串)
{
    while (n--) //找到原字元串的結束
    {
        if (*dst == '\0')
            break;
        dst++;
    }
    do 
    {
        *dst++ = *src++; //連接配接
        if ((--n)==0)
            break;
    } while (*src);
    *dst = '\0'; //加上字元串結束标志
}

//編寫一個my_strcpy_end函數,它類似于strcpy函數,但他傳回指向目标字元串結尾的得指針不會溢出目标數組。複制的結果必須是一個真正的字元串
char* my_strcpy_end(char *dst,char const *src,int n)
{
    while (--n) //n控制溢出
    {
        if (*src == '\0')
            break;
        *(dst++) = *(src++);
    }
    *dst='\0';
    return dst;
}

//編寫一個my_strchr函數,他類似于strchr函數,隻是他傳回最後一次出現ch這個字元的位址。
char *my_strchr(char  *str,int ch)
{
    char *result = NULL;
    while (*str)
    {
        if (ch == (int)*str)
            result = str;
        str++;
    }
    return result;
}

//編寫一個my_strchr函數,他類似于strchr函數,隻是他傳回第n次出現ch這個字元的位址。
char *my_strnchr(char  *str,int ch,int n)
{
    char *result = NULL;
    while (*str)
    {
        if ((int)*str == ch)
        {
            result = str;
            if (0 == --n)
               break;
        }
        str++;
    }
    return result;
}

//編寫一個count_chars函數,該函數在第一個參數中進行查找,并傳回chars中被比對字元的個數。
int count_chars(char const*str,char const *chars)
{
    char const *tmp = str;
    int count = 0;
    while (*chars)
    {
        tmp = str;
        while (*tmp)
        {
            if (*tmp == *chars)
            {
                count++;
                break;
            }
            tmp++;
        }
        chars++;
    }
    return count;
}

//編寫一個函數,原型:palindrome(char *str),如果參數字元串是回文就傳回1,不是回文傳回
//(回文:Madam ,I'm Adam.忽略所有非字母字元)
int palindrome(char *str)
{
    char *tmp = str;
    while (*str)
        str++;
    str-=1;
    while (tmp<str)
    {
        if (*tmp>='a' && *tmp<='z' || *tmp>='A' && *tmp<='Z')
        {
            if (*str>='a' && *str<='z' || *str>='A' && *str<='Z')
            {
                *tmp = tolower(*tmp);
                *str = tolower(*str);
                if (*tmp != *str)
                    return 0;
                tmp++,str--;
            }
            else
                str--;
        }
        else
            tmp++;
    }
    return 1;
}

//寫一個函數,找出參數2的字元串再參數1字元串中比對的次數。
int count_target(char const* str,char *target)
{
    int count = 0;
    while (*str)
    {
        char *tmp = target;
        if (*tmp == *str)
        {
            while (*tmp)
            {
                if (*tmp == *str)
                {
                    tmp++,str++;
                }
                else
                    break;
            }
            if ('\0'==*tmp)
            {
                count++;
            }
        }
        else
           str++;
    }
    return count;
}
           

繼續閱讀