字符串操作函數的實現方法(代碼)

說明

字符串操作函數在C語言中的使用是相當多的,也難怪標準庫函數有定義實現,也是一個很明智的選擇,幫助我們簡化了對字符串的操作。
其實我們也可以嘗試寫一下這些常用函數的具體實現方法,也可以幫助我們對這些函數有更深的理解,之後使用時也會更加自如。


查看函數的使用手冊

要實現一個函數,當然先需要知道它的作用是什麼,相信大多數人都會擺渡,基本也都能解決問題。Linux環境下,其實我們可以用man命令查看函數的使用說明,有很詳細的講解,包括函數的聲明、使用描述、返回值等,只不過是英文的,但是可以嘗試查看,相信以後會有幫助。
具體的使用我就不寫了,直接寫實現代碼,不一定十分嚴密,也應該不是最簡潔高效的,但基本沒大問題,經供參考。

注意:
1、函數開頭的輸入錯誤的判斷我寫的不嚴密,不要照着使用。我覺得有些可以打印提示後,直接用assert退出。
2、個人覺得大多數都是不難的,最難的可能就是strtok函數了,一定要先理解它的使用方法。


字符串操作函數

1、strlen

#define ERR_INPUT -2

int strlen(const char *str)
{
    if(!str)
    {
        printf("INPUT ERROR!\n");
        return ERR_INPUT;              
    }

    int len = 0;
    while(str[len] != '\0')
    {
        len++;
    }
    return len;
}

2、strcat

char *strcat(char *dest, const char *src)
{
    if(!dest || !src)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    int len = strlen(dest);
    int i = 0;
    while(src[i] != '\0')
    {
        dest[len + i] = src[i];
        i++;
    }
    dest[len + i] = '\0';
    return dest;
}

3、strcmp

int strcmp(const char *str1, const char *str2)
{
    if(!str1 || !str2)
    {
        printf("INPUT ERROR!\n");
        return -2;              
    }

    int len = strlen(str1);
    int len2 = strlen(str2);
    if(len2 < len)
        len = len2;
    int i = 0;
    int check = 0;
    for(i = 0; i <= len; i++)
    {
        if(str1[i] > str2[i])
        {
            check = 1;
            break;
        }
        else if(str1[i] < str2[i])
        {
            check = -1;
            break;
        }
    }
    return check;
}

4、strncmp

int strncmp(const char *str1, const char *str2, int n)
{
    if(!str1 || !str2 || n < 1)
    {
        printf("INPUT ERROR!\n");
        return -2;              
    }

    int i = 0;
    int check = 0;
    for(i = 0; i < n; i++)
    {
        if(str1[i] > str2[i])
        {
            check = 1;
            break;
        }
        else if(str1[i] < str2[2])
        {
            check = -1;
            break;
        }
    }
    return check;
}

5、strcasecmp

int strcasecmp(const char *str1, const char *str2)
{
    if(!str1 || !str2)
    {
        printf("INPUT ERROR!\n");
        return -2;              
    }

    char p1, p2;
    int len = strlen(str1);
    int len2 = strlen(str2);
    if(len2 < len)
        len = len2;
    int i = 0;
    int check = 0;
    for(i = 0; i <= len; i++)
    {
        p1 = str1[i];
        p2 = str2[i];
        if(str1[i] >= 'A' && str1[i] <= 'Z')
            p1 = str1[i] + 32;
        if(str2[i] >= 'A' && str2[i] <= 'Z')
            p2 = str2[i] + 32;

        if(p1 > p2)
        {
            check = 1;
            break;
        }
        else if(p1 < p2)
        {
            check = -1;
            break;
        }
    }
    return check;
}

6、strchr

char *strchr(const char *str, int n)
{
    if(!str || n < 0 || n > 127)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    char *p = NULL;
    int i = 0;
    while(str[i] != '\0')
    {
        if(str[i] == n)
        {
            p = (char *)str + i;
            break;
        }
        i++;
    }
    return p;
}

7、strtok

char *strtok(char *str, const char *s)
{
    if(!str || !s)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    static char *last = NULL;
    static int p = 0;
    static int a[100] = {0};
    if(str == NULL && last == NULL)
        return ;

    if(last != NULL)
    {
        p++;
        last = last + a[p] - a[p - 1];
        return (last + 1);
    }

    int lenstr = strlen(str);
    int lens = strlen(s);

    int m = 0;
    int n = 0;
    int i = 0;
    for(m = 0; m < lenstr; m++)
    {
        for(n = 0; n < lens; n++)
        {
            if(str[m] == s[n])
            {
                str[m] = '\0';
                a[i] = m;
                i++;
                m++;
                break;
            }
        }
    }
    last = str;
    return last;
}

8、strcpy

char *strcpy(char *dest, const char *src)
{
    if(!dest || !src)
    {
        printf("INPUT ERROR!\n");
        return NULL;              
    }

    int i = 0;
    while(src[i] != '\0')
    {
        dest[i] = src[i];
        i++;
    }
    dest[i] = '\0';
    return dest;
}

9、strncpy

char *strncpy(char *dest, const char *src, int n)
{
    if(!dest || !src || n < 1)
    {
        printf("INPUT ERROR!\n");
        return NULL;           
    }

    int i = 0;
    while(src[i] != '\0' && i < n)
    {
        dest[i] = src[i];
        i++;
    }
    while(i < n)
    {
        dest[i] = '\0';
        i++;
    }
    return dest;
}

10、strstr

char *strstr(const char *haystack, const char *needle)
{
    if(!haystack || !needle)
    {
        printf("INPUT ERROR!\n");
        return NULL;        
    }

    int len1 = strlen(haystack);
    int len2 = strlen(needle);
    int len = len1 - len2 + 1;

    int i = 0;
    int t = 0;
    char *p = NULL;
    int flag = 1;
    for(i = 0; i < len; i++)
    {
        flag = 1;
        for(t = i; t < len2 + i; t++)
        {
            if(haystack[t] != needle[t - i])
            {
                flag = 0;
                break;
            }
        }
        if(flag)
        {
            p = (char *)haystack + i;
            break;
        }
    }
    return p;
}

發佈了43 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章