C語言經常使用庫函數實現

1.memcpy函數

memcpy 函數用於 把資源內存(src所指向的內存區域) 拷貝到目標內存(dest所指向的內存區域);拷貝多少個?有一個size變量控制拷貝的字節數;ios

函數原型:void *memcpy(void *dest, void *src, unsigned int count);express

用法:能夠拷貝任何類型的對象,由於函數的參數類型是void*(未定義類型指針),也就是說傳進去的實參能夠是int*,short*,char*等等,可是因爲函數拷貝的過程是一個字節一個字節的拷貝的,因此實際操做的時候要把void*強制轉化爲char*,這樣在指針加的時候纔會保證每次加一個字節;數組

#include <stdio.h>
#include <iostream>
#include <assert.h>

using namespace std;

/********memcpy()函數原型爲:void* memcpy(void* dest, void* src, size_t n); 返回指向dest的空類型指針*********/
//返回void* 類型的緣由,是爲了使用鏈式表達,即strlen((char*)(memcpy(dest,src,n)),這樣能夠直接計算dest的長度,是程序代碼更簡潔
/****注意void* 指針的使用,即該函數容許傳入任何類型的指針數據****/
void* memcpy(void *dest, void *src, size_t n)
{
    assert((dest != NULL) && (src != NULL));
    char *dest_t = (char*)dest;                  //轉換成字符型一個個複製拷貝,因爲函數拷貝的過程是一個字節一個字節的拷貝的,
                                                 //因此實際操做的時候要把void*強制轉化爲char*,
    char *src_f = (char*)src;                    //這樣在指針加的時候纔會保證每次加一個字節
    while (n-- > 0)
    {
        *(dest_t++) = *(src_f++);
    }
    return dest;//void* 必定要返回一個值(指針),這個和void不太同樣!函數返回指向dest的指針

}

int main()
{
    int a[5] = { 0, 1, 2 };
    int *b = new int[3];
    void *c = memcpy(b, a, 3 * sizeof(int));  //sizeof()能夠用類型作參數,也能夠傳入實際的變量
    for (int i = 0; i < 3; i++)            //數組作參數時,不退化爲指針,統計的是數組總體佔據的內存
    {
        cout << b[i] << endl;
    }
    int *temp = (int*)c;
    temp++;
    cout << endl;
    cout << *temp << endl;
    return 0;
}

注1:與strcpy相比,memcpy並非遇到'\0'就結束,而是必定會拷貝完n個字節。函數

    2:若是目標數組dest自己已有數據,執行memcpy()後,將覆蓋原有數據(最多覆蓋n)。spa

//memcpy用來作內存拷貝,你能夠拿它拷貝任何數據類型的對象,能夠指定拷貝的數據長度;

  char a[100], b[50];

  memcpy(b, a,sizeof(b)); //注意如用sizeof(a),會形成b的內存地址溢出。

  strcpy就只能拷貝字符串了,它遇到'\0'就結束拷貝;例:

  char a[100], b[50];

      strcpy(a,b);

2.strcpy函數

#include <stdio.h>
#include <iostream>

using namespace std;

/********strcpy()函數原型爲:char *strcpy(char* dest, const char *src); 返回指向dest的指針*********/
//返回char* 類型的緣由,是爲了使用鏈式表達,即strlen(strcpy(dest,src)),這樣能夠直接計算dest的長度,是程序代碼更簡潔

char* strcpy(char *dest, char *src)
{
    if(dest == NULL || src == NULL)
        return NULL;
    char *res = dest;//保存原始dst的首地址
    while(*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = '\0';
    return res;
}

int main()
{
    char *src = "hello world";
    char *dest = new char;
    //strcpy(dest,src);
    int len = strlen(strcpy(dest,src));
    cout << len << endl;
    cout << dest << endl;
    return 0;
}

 3.strcat函數

功能:把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')。

說明:src和dest所指內存區域不能夠重疊且dest必須有足夠的空間來容納src的字符串。返回指向dest的指針。指針

#include <stdio.h>
#include <iostream>

using namespace std;

char* strcat(char *dest, char *src)
{
    if (dest == NULL)
        return NULL;
    if (src == NULL)
        return dest;
    char *head = dest;
    while (*dest != '\0')
        dest++;
    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = '\0';
    return head;
}


int main()
{
    char dest[] = "nihao";
    char src[] = "zhouyang";
    char *res = strcat(dest, src);
    cout << dest << endl;
    system("pause");
    return 0;
}

4.strcmp函數

功能:比較兩個字符串大小。code

其實是對字符的ASCII碼進行比較,實現原理以下:首先比較兩個串的第一個字符,若不相等,則中止比較並得出兩個ASCII碼大小比較的結果;若是相等就接着比較第二個字符而後第三個字符等等。不管兩個字符串是什麼樣,strcmp函數最多比較到其中一個字符串遇到結束符'/0'爲止,就能得出結果。對象

返回結果:①str1小於str2,返回負值或者-1(VC返回-1);②str1等於str2,返回0;③str1大於str2,返回正值或者1(VC返回1);blog

#include <stdio.h>
#include <iostream>
#include <assert.h>

using namespace std;

/****strcmp原型: int strcmp(const char *str1, const char *str2)*****/
int strcmp(const char *str1, const char *str2)
{
    assert((str1 != NULL) && (str2 != NULL));
    while ((*str1 != '\0') && (*str2 != '\0'))
    {
        if (*str1 == *str2)
        {
            str1++;
            str2++;
        }
        else
        {
            if (*str1 > *str2)
                return 1;
            else
                return -1;
        }
    }
    if (*str1 == '\0' && *str2 == '\0')
        return 0;
    else if (*str1 == '\0' && *str2 != '\0')
        return -1;
    else if (*str1 != '\0' && *str2 == '\0')
        return 1;
}

int main()
{
    char *str1 = "78";
    char *str2 = "789";
    int res = strcmp(str1, str2);
    cout << res << endl;
    system("pause");
    return 0;
}

5.strlen函數

功能:返回字符串的長度。內存

#include <stdio.h>
#include <iostream>
#include <assert.h>


using namespace std;

/********strlen()函數原型爲:int strlen(const char *src); 返回字符串的長度*********/
size_t strlen(const char *str)
{
    assert(str != NULL);
    int num = 0;
    while(*str != '\0')
    {
        str++;
        num++;
    }
    return num;
}

int main()
{
    char *str = "123456";
    int temp = strlen(str);
    cout << temp << endl;
    return 0;
}

6.strncpy

功能:將字符串src中最多n個字符複製到字符數組dest中(它並不像strcpy同樣遇到NULL才中止複製,而是等湊夠n個字符纔開始複製),返回指向dest的指針。

要求:若是n > dest串長度,dest棧空間溢出產生崩潰異常。該函數注意的地方和strcpy相似,可是n值需特別注意。

#include <iostream>
#include <stdio.h>

using namespace std;

/***string.h,char *strncpy(char *dest, const char *src, size_t n),
把src所指向的字符串中以src地址開始的前n個字節複製到dest所指的數組中,並返回dest。**/
char* mystrncpy(char *dest, const char *src, size_t n)
{
    if (dest == NULL || src == NULL || n < 0)
        return NULL;
    char *res = dest;
    while (n--)
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = '\0';
    return res;
}

int main()
{
    char *src = "hello world";
    char c[10];
    char *res = mystrncpy(c, src, 7);
    cout << res << endl;
    system("pause");
    return 0;

}

 7.strstr函數

功能:給出字符串str1, str2,判斷str2是否爲str1的子字符串,若是是,返回str2在str1中對應的起始地址。

#include <stdio.h>
#include <iostream>
#include <assert.h>

using namespace std;

/****
函數原型:
extern char *strstr(const char *str1, const char *str2);

str1: 被查找目標 string expression to search.
str2: 要查找對象 The string expression to find.
返回值:若str2是str1的子串,則返回str2在str1的首次出現的地址;若是str2不是str1的子串,則返回NULL。
****/

const char* strstr(const char *str1, const char *str2)
{
    if (str1== NULL || str2 == NULL)
        return NULL;
    const char *temp = str1;
    const char *res = str2;while (*str1 != '\0')
    {
        temp = str1;
        res = str2;
        while (*temp== *res){
            temp++;
            res++;
        }
        if (*res == '\0')return str1;
        str1++;

    }
    return NULL;

}
int main()
{
    char *src = "1234567";
    char *dest = "345";
    const char *res = strstr(src, dest);
    cout << res<< endl;//cout<<重載了,會直接輸出字符串內容而不是地址
    system("pause");
    return 0;
}
相關文章
相關標籤/搜索