溫馨提示×

溫馨提示×

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

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

C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用

發(fā)布時間:2022-05-12 13:40:51 來源:億速云 閱讀:131 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

    字符串函數(shù)

    長度不受限制的字符串函數(shù)

    strlen

    size_t strlen ( const char * str )

    求字符串長度:

    字符串以'\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 '\0' 前面出現(xiàn)的字符個數(shù)(不包含 '\0' )

    參數(shù)指向的字符串必須要以 '\0' 結(jié)束

    注意函數(shù)的返回值為size_t,是無符號的

    例子如下:計算Hello World! 的字符數(shù)

    C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用

    strcpy

    char* strcpy(char * destination, const char * source )

    用法:將 source 指向的 C 字符串復(fù)制到 destination 指向的數(shù)組中,包括終止空字符(并在該點(diǎn)停止)

    注意:

    源字符串必須以 '\0' 結(jié)束。

    會將源字符串中的 '\0' 拷貝到目標(biāo)空間。

    目標(biāo)空間必須足夠大,以確保能存放源字符串。

    目標(biāo)空間必須可變

    strcpy的實(shí)現(xiàn):

    char * strcpy(char *dest, const char*src)
    { 
     char *ret = dest;//記錄下字符串dest的起始地址
     assert(dest != NULL);
     assert(src != NULL);
     while((*dest++ = *src++))//copy
     {
      ;
     }
     return ret;//返回起始地址
    }
    strcat

    char * strcat ( char * destination, const char * source )

    用法:將源字符串的副本附加到目標(biāo)字符串。也就是將src字符串接在dest的字符串后面,并且src字符串的第一個字符覆蓋dest的最后一個字符(\0),并且在接好的字符串后加上'\0'

    注意:

    源字符串必須以 '\0' 結(jié)束。

    目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容。

    目標(biāo)空間必須可修改。

    strcat的實(shí)現(xiàn):

    char * strcat(char *dest, const char*src)
    {
     char *ret = dest;
     assert(dest != NULL);
     assert(src != NULL);
    //找到目標(biāo)空間
     while(*dest)
     {
      dest++;
     }
    //拷貝
     while((*dest++ = *src++))
     {
      ;
     }
     return ret;
    }
    strcmp

    int strcmp ( const char * str1, const char * str2 )

    用法:此函數(shù)開始比較每個字符串的第一個字符。如果它們等于每個其他,它會繼續(xù)以下對,直到字符不同或終止達(dá)到空字符。

    注意:

    第一個字符串大于第二個字符串,則返回大于0的數(shù)字

    第一個字符串等于第二個字符串,則返回0

    第一個字符串小于第二個字符串,則返回小于0的數(shù)字

    strcmp的實(shí)現(xiàn):

    ?int strcmp(const char* st1, const char* st2)
    {
    	int ret = 0;
    	while (*st1 == *st2)
    	{
    		st1++;
    		st2++;
    		if(*st1 == *st2 && *st1 == '\0')
    			return ret;//相等的時候返回0
    	}
    	return *st1 - *st2;

    長度受限制的字符串函數(shù)介紹

    strncpy

    拷貝num個字符從源字符串到目標(biāo)空間。

    如果源字符串的長度小于num,則拷貝完源字符串之后,在目標(biāo)的后邊追加0,直到num個。

    strncat

    將源的前 num 個字符附加到目標(biāo),加上一個終止空字符。

    如果 source 中 C 字符串的長度小于 num,則只有到終止符的內(nèi)容空字符被復(fù)制

    strncmp

    比較到出現(xiàn)另個字符不一樣或者一個字符串結(jié)束或者num個字符全部比較完。

    字符串查找以及錯誤報告

    strstr

    char * strstr ( const char *str1, const char * str2)

    返回指向 str1 中第一次出現(xiàn) str2 的指針,如果 str2 不屬于字符串str1就返回空指針

    strstr的實(shí)現(xiàn):

    char* strstr(const char* st1, const char* st2)
    {
    	//st1,st2標(biāo)注起始位置
    	char* s1 = st1;
    	char* s2 = st2;
    	char* cur = s1;
    	while (*cur)
    	{
    		s1 = cur;
    		while (*s1 == *s2 && *s1 && *s2)
    		{
    			s1++;
    			s2++;
    		}
    		if (*s2 == '\0')
    		{
    			return cur;
    		}
    		cur++;
    	}
    	return NULL;//找不到
    }
    strtok

    用法:根據(jù)給出的字符將字符串分隔開

    char * strtok ( char * str, const char * sep )

    sep參數(shù)是個字符串,定義了用作分隔符的字符集合

    第一個參數(shù)指定一個字符串,它包含了0個或者多個由sep字符串中一個或者多個分隔符分割的標(biāo)

    記strtok函數(shù)找到str中的下一個標(biāo)記,并將其用 \0 結(jié)尾,返回一個指向這個標(biāo)記的指針。(注:

    strtok函數(shù)會改變被操作的字符串,所以在使用strtok函數(shù)切分的字符串一般都是臨時拷貝的內(nèi)容

    并且可修改。)

    strtok函數(shù)的第一個參數(shù)不為 NULL ,函數(shù)將找到str中第一個標(biāo)記,strtok函數(shù)將保存它在字符串

    中的位置。

    strtok函數(shù)的第一個參數(shù)為 NULL ,函數(shù)將在同一個字符串中被保存的位置開始,查找下一個標(biāo)

    記。

    如果字符串中不存在更多的標(biāo)記,則返回 NULL 指針

    這里演示一下:

    C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用

    strerror

    char * strerror ( int errnum )

    返回錯誤碼,所對應(yīng)的錯誤信息

    這里頭文件為#include<errno.h>

    演示如下;

    C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用

    內(nèi)存操作函數(shù)

    memcpy

    void * memcpy ( void * destination, const void * source, size_t num )

    用法:函數(shù)memcpy從source的位置開始向后復(fù)制num個字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。

    這個函數(shù)在遇到 '\0' 的時候并不會停下來。

    如果source和destination有任何的重疊,復(fù)制的結(jié)果都是未定義的。

    memcpy的實(shí)現(xiàn):

    ?void* memcpy(void* dest, const void* src, size_t sz)
    {
    	assert(dest && src);
    	void* ret = dest;
    	int count = sz;
    	while (count--)
    	{
    		*(char*)dest = *(char*)src;//拷貝
    		dest = (char*)dest + 1;
    		src = (char*)src + 1;
    	}
    	return ret;
    }

    memmove

    void * memmove ( void * destination, const void * source, size_t num )

    用法:和memcpy的用法差不多,和memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和目標(biāo)內(nèi)存塊是可以重疊的。

    如果源空間和目標(biāo)空間出現(xiàn)重疊,就得使用memmove函數(shù)處理

    memmove的實(shí)現(xiàn):

    void* memmove(void* dest, const void* src, size_t sz)
    {
    	assert(dest && src);//斷言
    	int* ret = dest;
    	int count = sz;
    	if (*(char*)dest > *(char*)src && *(char*)dest < *(char*)src + count)
    	{
    		//后->前
    		while (count--)
    		{
    			*((char*)dest + count) = *(char*)src + count;
    		}
    	}
    	else
    	{
    		//前->后
    		while (count--)
    		{
    			*(char*)dest = *(char*)src;
    			dest = (char*)dest + 1;
    			src = (char*)src + 1;
    		}
    	}
    	return ret;
    }

    memcmp

    int memcmp ( const void * ptr1,const void * ptr2,size_t num )

    用法:比較從ptr1和ptr2指針開始的num個字節(jié)

    返回值:

    C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用

    讀到這里,這篇“C語言字符串函數(shù)和內(nèi)存函數(shù)怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

    AI