91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言string庫strcpy、strcmp、strcat函數如何使用

發布時間:2023-02-24 15:38:43 來源:億速云 閱讀:158 作者:iii 欄目:開發技術

這篇文章主要介紹“C語言string庫strcpy、strcmp、strcat函數如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C語言string庫strcpy、strcmp、strcat函數如何使用”文章能幫助大家解決問題。

    C語言string庫strcpy、strcmp、strcat函數

    • strcpy

    即string copy

    語法格式為strcpy(str1, str2), 作用是將str2賦值給str1

    使用方法類似于

    char str1[10], str2[] = "abc";
    strcpy(str1, "bcd");
    strcpy(str1, str2);
    printf("%s", str1);  // abc

    str2可以是字符串, 也可以是字符串首地址(指針)。

    strcpy會從傳入的地址開始寫入, 如代碼為strcpy(str1+1, str2),程序會從str1第二個元素開始寫入str2的值

    值得注意的是, strcpy將指定內容添加到字符串中后, 會在末尾添加一個空字節‘\0’, 以表示字符串結束。

    如:

    char str[5] = "abcde";

    C語言string庫strcpy、strcmp、strcat函數如何使用

    strcpy(str, "xyz");

    C語言string庫strcpy、strcmp、strcat函數如何使用

    因此,使用strcpy將某字符串的內容賦予長度為n的字符串時, 被復制的字符串長度最大為n-1(留一個位置給’\0’),否則會有溢出的

    報錯類似:builtin_memcpy’ writing 11 bytes into a region of size 10 overflows the destination 。

    • strcat

    strcat(str1, str2)

    將str2拼接到str1的末尾

    char str[10] = "abc";
    strcat(str ,"cde");
    printf("%s", str);  // abccde

    使用strcat(str1, str2)時, 程序會從str1第一個空字節開始將str2的內容寫入, 并在末尾重寫空字節。

    所以, str1中必須有足夠的空間來放入str2,即str1原先內容后面至少要有strlen(str2)+1個字節。

    • strcmp

    即string compare

    用于比較兩個字符串。

    規則是從兩個字符串第一個字符開始比較(ascii), 若相同則比較下一個字符,直到不同為止;若str1對應位置的字符的ascii值小于str2的, 返回一個負整數(一般為-1, 取決于系統, 有的會返回ascii碼的差值),反之返回一個正整數(1);若兩個字符串的長度和每個字符都相同, 則返回0。

    C語言實現各類string函數

    1.實現strcpy(字符串復制)

    函數原型:char strcpy(char dest, const char src);

    strcpy把含有’\0’結束符的字符串復制到另一個地址空間,返回值的類型為char。

    代碼:

    #include<stdio.h>
    #include<windows.h>
    #include<assert.h>
    
    char* my_strcpy(char *des, char const *stc)
    {
        assert(des != NULL);
        assert(stc != NULL);
        char* res = des;
        while (*stc){
            *des = *stc;
            stc++;
            des++;
        }
        return res;
    }
    
    int main()
    {
        char str1[100] = { 0 };
        char *str2 = "i am wangwenqian.";
        my_strcpy(str1, str2);
        printf("%s\n", str1);
        system("pause");
        return 0;
    }

    2.實現strcat

    函數原型:extern char strcat(char dest, const char src);

    功能:把src所指向的字符串(包括“\0”)復制到dest所指向的字符串后面(刪除dest原來末尾的“\0”)。要保證dest足夠長,以容納被復制進來的src。*src中原有的字符不變。返回指向dest的指針。

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

    代碼:

    #include<stdio.h>
    #include<windows.h>
    #include<assert.h>
    
    char* my_strcat(char *des, char const *stc)
    {
        char* ret = des;
        assert(des != NULL);
        assert(stc != NULL);
        while (*des){   //des指向\0
            des++;
        }
        while (*stc){  //拼接stc
            *des = *stc;
            des++;
            stc++;
        }
        return ret;
    }
    
    int main()
    {
        char str1[100] = "abc";
        char *str2 = "cdefg";
        my_strcat(str1, str2);//str1實際傳址
        printf("%s\n", str1);
        system("pause");
        return 0;
    }

    3.實現strstr

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

    strstr(str1,str2) 函數用于判斷字符串str2是否是str1的子串。如果是,則該函數返回str2在str1中首次出現的地址;否則,返回NULL。

    代碼:

    #include<stdio.h>
    #include<windows.h>
    #include<assert.h>
    
    char* my_strstr(const char *str1, const char *str2)
    {
        assert(str1);
        assert(str2);
        char *ret = (char *)str1;
        char *res = (char *)str2;
        while (*ret){
            char cp = (char *)str1;
            if (*ret == *res && *res != '\0'){  //當*ret與*res相等且*res不為0時,倆個指針同時向后移動
                ret++;
                res++;
            }
                if (*res == "\0"){  //*res為0,說明滿足了上一個if條件,且找到字串
                return cp;
            }
            if (*ret == '\0'){  //*ret為\0,表示其一直向后移動,說明并沒有找到字串
                return NULL;
            }
            ret++;  //讓ret一直向后移動
        }
    }
    
    int main()
    {
        char *str1 = "question";
        char *str2 = "tion";
        char *ret = my_strstr(str1, str2);
        printf("%p\n",ret );
        system("pause");
        return 0;
    }

    4.實現strchr

    函數原型:extern char *strchr(const char *s,char c)

    可以查找字符串s中首次出現字符c的位置。

    代碼:

    #include<stdio.h>
    #include<stdlib.h>
    
    char * my_strchr(const char * str, char c)
    {
        while (*str != '\0' &&  *str != c){
            str++;
        }
        return str;
    }
    
    int main()
    {
        char arr[] = "student";
        char c = 'u';
        char *ret = my_strchr(arr, c);
        printf("%s\n", arr);
        system("pause");
        return 0;
    }

    5.實現strcmp

    函數原型:extern int strcmp(const char *s1,const char *s2);

    比較倆個字符串。若str1=str2,則返回零;若str1<str2,則返回負數;若str1>str2,則返回正數。

    #include<stdio.h>
    #include<windows.h>
    #include<assert.h>
    
    int strcmp(const char *str1, const char *str2)
    {
        assert(str1);
        assert(str2);
        while (*str1 && (*str1==*str2)){
            str1++;
            str2++;
        }
        if ((*(unsigned char *)str1) > (*(unsigned char *)str2))
            return 1;
        else if ((*(unsigned char *)str1) < (*(unsigned char *)str2))
            return -1;
        else
            return 0;
    }
    
    int main()
    {
        char *str1 = "abcd";
        char *str2 = "abcdef";
        int ret = strcmp(str1, str2);
        printf("%d\n", ret);
        system("pause");
        return 0;
    }

    6.實現memcpy

    函數原型:void *memcpy(void *dest, const void *src, size_t n);

    從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中。

    代碼:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #define N 20
    
    char * my_memcpy(char *des, char *stc, int len)
    {
        assert(des);
        assert(stc);
        char *res = des;
        while (len--){
            *des = *stc;
            des++;
            stc++;
        }
        return res;
    }
    
    int main()
    {
        char arr1[N] = "";
        char arr2[N] = "i am a student";
        my_memcpy(arr1, arr2, 6);
        printf("%s\n",arr1);
        system("pause");
        return 0;
    }

    7.實現memmove

    函數原型:void memmove( void dest, const void* src, size_t count );

    memmove用于拷貝字節,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的字節拷貝到目標區域中,但復制后源內容會被更改。但是當目標區域與源區域沒有重疊則和memcpy函數功能相同。

    代碼:

    #include<stdio.h>
    #include<stdlib.h>
    #define N 20
    
    char *my_memmove(char *des, char *str, int len)
    {
        void *ret = des;
        //無內存重疊
        if (des <= str || des >= str + len){  
            while (len--){
                *des = *str;
                des++;
                str++;
            }
        }
        else{
            des += (len - 1);
            str += (len - 1);
            while (len--){
                *des = *str;
                des--;
                str--;
            }
        }
        return ret;
    }
    
    int main()
    {
        char arr1[N] = "123456789";
        my_memmove(arr1+3, arr1, 5);
        printf("%s\n", arr1);
        system("pause");
        return 0;
    }

    關于“C語言string庫strcpy、strcmp、strcat函數如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    呼图壁县| 潞西市| 清镇市| 唐山市| 香格里拉县| 宁陵县| 绥阳县| 吉木萨尔县| 宜宾县| 泸溪县| 玉林市| 南汇区| 新泰市| 新竹市| 莎车县| 莱芜市| 敖汉旗| 永兴县| 朝阳区| 离岛区| 安福县| 岳普湖县| 濉溪县| 文昌市| 汽车| 上犹县| 蒙阴县| 彭州市| 涞水县| 安图县| 保定市| 东平县| 屏南县| 北票市| 和顺县| 什邡市| 蓬溪县| 星座| 南郑县| 上林县| 舟山市|