【算法】【字符串】C語言常用庫函數實現

strcpy

#include <iostream>
#include <assert.h>
using namespace std;

char * my_strcpy(char* str1,const char* str2)
{
    char* p = str1;
    assert(str1 != NULL && str2 != NULL);
    while((*p++ = *str2++) != '\0');
    return p;
}


int main()
{
    const char str[] = "abcdef";
    char s[] = "";
    my_strcpy(s, str);
    cout << s << endl;
    return 0;
}

strcat

#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

char* my_strcat(char* dest, const char* src)
{
    assert(dest != NULL && src != NULL);
    char *p = dest;
    while(*p != '\0') p++;
    while((*p++ = *src++) != '\0');
    return p;
}

int main()
{
    const char str[] = "abcdef";
    char s[] = "e";
    my_strcat(s, str);
    cout << s << endl;
    return 0;
}

reverse

#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

char* my_reverse(char* str)
{
    assert(str != NULL);
    char *p = str;
    int len = 0;
    while(*p++ != '\0') len++;
    int l = 0, r = len - 1;
    while(l < r)
    {
        str[l] = str[l] ^ str[r];
        str[r] = str[l] ^ str[r];
        str[l] = str[l] ^ str[r];

        l++;
        r--;
    }
    return str;
}

int main()
{
    char str[] = "abcdef";
    cout << my_reverse(str) << endl;
    cout << str << endl;
    return 0;
}

strstr

#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

char* my_strstr(char* str1, char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    while (*str1 != '\0')
    {
        char* src = str1;
        char* tmp = str2;
        do
        {
            if (*tmp == '\0')
                return str1;
        } while (*tmp++ == *src++);
        str1++;
    }
    return NULL;
}

int main()
{
    char str[] = "abcdef";
    char str2[] = "x";
    if (my_strstr(str, str2) != NULL)
        cout << my_strstr(str, str2) << endl;
    else
        cout << "NULL" << endl;
    return 0;
}

memcpy

#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

void* my_memcpy(void* dest, void* src, size_t size)
{
    assert(dest != NULL && src != NULL && size > 0);
    char *tmp_dst = (char *)dest;
    char *tmp_src = (char *)src;
    if(tmp_src < tmp_dst && tmp_dst < tmp_src + size)
    {
        tmp_dst = tmp_dst + size - 1;
        tmp_src = tmp_src + size - 1;
        while(size--) *tmp_dst-- = *tmp_src--;
    }
    else
        while(size--) *tmp_dst++ = *tmp_src++;

    return dest;
}


int main()
{
    char str[] = "abcdef";
    cout << my_memcpy(str + 2, str, 2) << endl;
    cout << str << endl;
    return 0;
}

atoi

#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

int my_atoi(char *str)
{
    assert(str != NULL);
    char *tmp = str;
    while(*tmp != '\0' && *tmp == ' ') tmp++;

    int flag = 0;
    if(*tmp == '-') flag = 1, tmp++;
    if(*tmp == '+') tmp++;

    int sum = 0;
    while(*tmp >= '0' && *tmp <= '9')
    {
        int val = *tmp - '0';
        if(sum > 0x7fffffff / 10 || (sum == 0x7fffffff / 10) && val > 0x7fffffff % 10)
            return flag ? 0x80000000 : 0x7fffffff;

        sum = sum * 10 + val;
        tmp++;
    }

    return flag ? -sum : sum;

}


int main()
{
    char str[] = "   2147483649";
    cout << my_atoi(str) << endl;
    cout << str << endl;
    cout << 0x80000000 << endl; // 負數 符號位爲1 以反碼錶示
    cout << 0x7fffffff << endl; // 整數 符號位爲0 
    return 0;
}

參考:
https://www.cnblogs.com/Manual-Linux/p/11773222.html

strcmp

#include <iostream>
#include <string.h>
#include <assert.h>
using namespace std;

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1 != NULL && str2 != NULL);
    while(str1 && str2 && *str1 == *str2)
    {
        str1++;
        str2++;
    }
    return *str1 - *str2;
}

int main()
{
    char dst[] = "hello world";
    char src[] = " ok";
    cout << my_strcmp(dst, src) << endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章