1. 程式人生 > 實用技巧 >c string 常用函式

c string 常用函式

1:void *memchr(const void *str, int c, size_t n)在str的前n個位元組中搜索第一次出現字元 c的位置。返回字元位置的指標

    char *str = "hello low";
    char ch = 'l';
    char * ret =(char *)memchr(str, ch, 7); //llo low
ptrdiff_t num = ret - str; //2

2:int memcmp(const void *str1, const void *str2, size_t n),比較倆個字串的前幾個位置,相同返回0;返回值 < 0,則表示 str1 小於 str2,返回值 > 0,則表示 str2 小於 str1

int ret_value = memcmp("asd01", "asd0www", 4);
//ret_value=0

3:void* memcpy(void* Dst,void const* Src, size_t Size); 從儲存區將Src中的Size個位元組拷貝到Dst。

errno_t memcpy_s(void * restrict dest,rsize_t destsz,const void * restrict src,rsize_t count);destsz 目標的大小

    char Dst[10] = "qweshh";
    char* Src = "sss";
    
char * ret_cpy= memcpy(Dst, Src, 2); //sse char * ret_cpy = memcpy(Dst+5, Dst+2, 2);

4:void * memmove(void * dest,const void * src,size_t count)是在重疊記憶體塊這方面,memmove() 是比 memcpy() 更安全的方法。如果目標區域和源區域有重疊的話,memmove() 能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中,複製後源區域的內容會被更改。如果目標區域與源區域沒有重疊,則和 memcpy() 函式功能相同。

errno_t memmove_s(void * dest,rsize_t destsz,const void * src,rsize_t count);

        char * ret_cpy=memmove(Dst, Src, 1);
    char* des = (char*)malloc(4 * sizeof(char));
    char * ret_cpy = strcpy(des, Src);
    char str[] = "1234567890";
    memmove(str + 4, str + 3, 3);

5:void * memset(void * dest,int ch,size_t count //複製字元ch到dest前 count個字元,用在對定義的字串進行初始化,對結構體或陣列清零初始化等

errno_t memset_s(void * dest,rsize_t destsz,int ch,rsize_t count),

memset對非字元型陣列賦初值是不可取的!

例:

int mem[10];
memset(mem, 2, sizeof(mem));//錯誤並不鞥賦值

        char memset_str[] = "qwerzxc";
    memset(memset_str, 'u', 3);

6:

char *strcat(char *dest, const char *src) 合併字串dest+ src;
char *strncat(char *dest, const char *src, size_t n) 合併字串可以指定長度,

7:

char *strchr(const char *str, int c),在str的中搜索第一次出現字元 c的位置。返回字元位置的指標

char *strrchr(const char *str, int c)在str的中搜索最後次出現字元 c的位置。返回字元位置的指標

8:

int strcmp(const char *str1, const char *str2),比較倆個字串,如果返回值小於 0,則表示 str1 小於 str2。如果返回值大於 0,則表示 str1 大於 str2。如果返回值等於 0,則表示 str1 等於 str2。
int strncmp(const char *str1, const char *str2, size_t n),比較倆個字串的前n 個字元

int strcoll(const char *str1, const char *str2),比較倆個字串,受本地化LC_COLLATE影響

9:

char *strcpy(char *dest, const char *src) 將Src中的Size個位元組拷貝到dest
char *strncpy(char *dest, const char *src, size_t n)將Src中的Size個位元組拷貝到dest

10:

size_t strcspn(const char *str1, const char *str2)在str1中第一次出現str2中字元的位置

size_t strspn(const char *str1, const char *str2) 在str1 中第一個不在字串 str2 中出現的字元的位置

const char str1[] = "A7345F4910";
const char str2[] = "53";
const char str3[] = "A73cc910";
int pos =strcspn(str1,str2);//2(A7)
int pos1 =strspn(str1, str3);//3(A73)

11:size_t strlen(const char *str)計算字串 str 的長度,直到空結束字元,但不包括空結束字元。對比sizeof();

    const char str2[] = "853";
    int len = strlen(str2);  //3
    int sizeoflen= sizeof(str2); //4
    char *str = "853";
    sizeoflen = sizeof(str); //4,指標的長度

12:char *strpbrk(const char *str1, const char *str2),在str1中查詢第一個與str2中匹配的字元,返回該字元位置。

    const char str1[] = "abcde1122334455";
    const char str2[] = "33";

    char * ret = strpbrk(str1,str2);
    printf("%s\n", ret);//334455

13:char *strtok(char *str, const char *delim) ,把字串 str 按delim分隔;返回分割後的子字串,不匹配返回null;

    const char str[] = "yy-mm-dd";
    char *delim_str = strtok(str,"-");
    while (delim_str)
    {
        printf("%s\n", delim_str);
        delim_str=strtok(NULL, "-");// 繼續分割
    }

14:char *strstr(const char *str1, const char *str2) 在 str1中查詢第一次出現字串 str2的位置,不包含終止符

        const char str1[] = "abcde1122334455";
    const char str2[] = "33";
    const char str3[] = "3355";
    char * ret=strstr(str1,str2);//334455
    char * ret1 = strstr(str1, str3);//null