溫馨提示×

溫馨提示×

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

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

C語言string庫strcpy、strcmp、strcat函數(shù)如何使用

發(fā)布時間:2023-02-24 15:38:43 來源:億速云 閱讀:149 作者:iii 欄目:開發(fā)技術(shù)

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

    C語言string庫strcpy、strcmp、strcat函數(shù)

    • 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將指定內(nèi)容添加到字符串中后, 會在末尾添加一個空字節(jié)‘\0’, 以表示字符串結(jié)束。

    如:

    char str[5] = "abcde";

    C語言string庫strcpy、strcmp、strcat函數(shù)如何使用

    strcpy(str, "xyz");

    C語言string庫strcpy、strcmp、strcat函數(shù)如何使用

    因此,使用strcpy將某字符串的內(nèi)容賦予長度為n的字符串時, 被復(fù)制的字符串長度最大為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第一個空字節(jié)開始將str2的內(nèi)容寫入, 并在末尾重寫空字節(jié)。

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

    • strcmp

    即string compare

    用于比較兩個字符串。

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

    C語言實現(xiàn)各類string函數(shù)

    1.實現(xiàn)strcpy(字符串復(fù)制)

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

    strcpy把含有’\0’結(jié)束符的字符串復(fù)制到另一個地址空間,返回值的類型為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.實現(xiàn)strcat

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

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

    說明:src和dest所指內(nèi)存區(qū)域不可以重疊且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.實現(xiàn)strstr

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

    strstr(str1,str2) 函數(shù)用于判斷字符串str2是否是str1的子串。如果是,則該函數(shù)返回str2在str1中首次出現(xiàn)的地址;否則,返回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'){  //當(dāng)*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.實現(xiàn)strchr

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

    可以查找字符串s中首次出現(xiàn)字符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.實現(xiàn)strcmp

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

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

    #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.實現(xiàn)memcpy

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

    從源src所指的內(nèi)存地址的起始位置開始拷貝n個字節(jié)到目標(biāo)dest所指的內(nèi)存地址的起始位置中。

    代碼:

    #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.實現(xiàn)memmove

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

    memmove用于拷貝字節(jié),如果目標(biāo)區(qū)域和源區(qū)域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區(qū)域的字節(jié)拷貝到目標(biāo)區(qū)域中,但復(fù)制后源內(nèi)容會被更改。但是當(dāng)目標(biāo)區(qū)域與源區(qū)域沒有重疊則和memcpy函數(shù)功能相同。

    代碼:

    #include<stdio.h>
    #include<stdlib.h>
    #define N 20
    
    char *my_memmove(char *des, char *str, int len)
    {
        void *ret = des;
        //無內(nèi)存重疊
        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;
    }

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

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI