最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)

 更新時(shí)間:2022年11月30日 11:30:09   作者:CGod  
C語(yǔ)言中對(duì)字符和字符串的處理很是頻繁,但是C語(yǔ)言本身是沒(méi)有字符串類型的,字符串通常放在常量字符串中或者字符數(shù)組中,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)的相關(guān)資料,需要的朋友可以參考下

前言

  • C語(yǔ)言中對(duì)字符和字符串的處理很是頻繁,但是C語(yǔ)言本身是沒(méi)有字符串類型的,字符串通常放在常量字符串中或者字符數(shù)組中
  • 字符串常量適用于那些對(duì)它不做修改的字符串函數(shù)

一、函數(shù)介紹

1.1 strlen

size_t strlen ( const char * str );
  • 字符串已經(jīng) '\0' 作為結(jié)束標(biāo)志,strlen函數(shù)返回的是在字符串中 ‘\0’ 前面出現(xiàn)的字符個(gè)數(shù)(不包 含’\0’` )
  • 參數(shù)指向的字符串必須要以'\0'結(jié)束。
  • 注意函數(shù)的返回值為size_t,是無(wú)符號(hào)的( 易錯(cuò) )

注:

#include <stdio.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt1>str2\n");
	}
	return 0;
}

輸出結(jié)果:

1.2 strcpy

char* strcpy(char * destination, const char* source);
  • 源字符串必須以 '\0' 結(jié)束
  • 會(huì)將源字符串中的 '\0' 拷貝到目標(biāo)空間
  • 目標(biāo)空間必須足夠大,以確保能存放源字符串
  • 目標(biāo)空間必須可變

1.3 strcat

char * strcat ( char * destination, const char * source );
  • 源字符串必須以 ‘\0’ 結(jié)束
  • 目標(biāo)空間必須有足夠的大,能容納下源字符串的內(nèi)容
  • 目標(biāo)空間必須可修改
  • 字符串自己給自己追加,如何?
    • 不可以,按上述規(guī)則自我追加的時(shí)候會(huì)覆蓋掉某些值

1.4 strcmp

int strcmp ( const char * str1, const char * str2 );
  • 第一個(gè)字符串大于第二個(gè)字符串,則返回大于0的數(shù)字
  • 第一個(gè)字符串等于第二個(gè)字符串,則返回0
  • 第一個(gè)字符串小于第二個(gè)字符串,則返回小于0的數(shù)字
  • 那么如何判斷兩個(gè)字符串?
    • 從首字符依次對(duì)比,對(duì)比的是相應(yīng)的ASCII碼值

1.5 strncpy

char * strncpy ( char * destination, const char * source, size_t num );
  • 拷貝num個(gè)字符從源字符串到目標(biāo)空間。
  • 如果源字符串的長(zhǎng)度小于num,則拷貝完源字符串之后,在目標(biāo)的后邊追加0,直到num個(gè)

1.6 strncat

char * strncat ( char * destination, const char * source, size_t num );
  • strncpy對(duì)strcpy的改進(jìn)一樣,strncat也是對(duì)strcat的改進(jìn),而且可以自我追加
  • 參數(shù)和strncpy無(wú)異
#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20];
	char str2[20];
	strcpy(str1, "To be ");
	strcpy(str2, "or not to be");
	strncat(str1, str2, 6);
	puts(str1);
	return 0;
}

輸出結(jié)果:

1.7 strncmp

int strncmp ( const char * str1, const char * str2, size_t num );
  • 比較到出現(xiàn)另個(gè)字符不一樣或者一個(gè)字符串結(jié)束或者num個(gè)字符全部比較完
  • 也是對(duì)strcmp的改進(jìn)
#include <stdio.h>
#include <string.h>
int main()
{
	char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
	int n;
	puts("Looking for R2 astromech droids...");
	for (n = 0; n < 3; n++)
		if (strncmp(str[n], "R2xx", 2) == 0)
		{
			printf("found %s\n", str[n]);
		}
	return 0;
}

輸出結(jié)果:

1.8 strstr

char * strstr ( const char *str1, const char * str2);
  • str1尋找與str2相等的子串,然后把該子串的起始位置返回
#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "This is a simple string";
	char* pch;
	pch = strstr(str, "simple");
	puts(pch);
	return 0;
}

1.9 strtok

char * strtok ( char * str, const char * sep );
  • sep參數(shù)是個(gè)字符串,定義了用作分隔符的字符集合
  • 第一個(gè)參數(shù)指定一個(gè)字符串,它包含了0個(gè)或者多個(gè)由sep字符串中一個(gè)或者多個(gè)分隔符分割的標(biāo)記
  • strtok函數(shù)找到str中的下一個(gè)標(biāo)記,并將其用 \0 結(jié)尾,返回一個(gè)指向這個(gè)標(biāo)記的指針(注:strtok函數(shù)會(huì)改變被其操作的字符串,所以在使用strtok函數(shù)切分的字符串一般都是臨時(shí)拷貝的內(nèi)容并且可修改)
  • strtok函數(shù)的第一個(gè)參數(shù)不為 NULL ,函數(shù)將找到str中第一個(gè)標(biāo)記,strtok函數(shù)將保存它在字符串中的位置
  • strtok函數(shù)的第一個(gè)參數(shù)為 NULL ,函數(shù)將在同一個(gè)字符串中被保存的位置開(kāi)始,查找下一個(gè)標(biāo)記
  • 如果字符串中不存在更多的標(biāo)記,則返回 NULL 指針
#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "- This, a sample string.";
	char* pch;
	printf("Splitting string \"%s\" into tokens:\n", str);
	pch = strtok(str, " ,.-");
	while (pch != NULL)
	{
		printf("%s\n", pch);
		pch = strtok(NULL, " ,.-");
	}
	return 0;
}

輸出結(jié)果:

1.10 strerror

#include <stdio.h>
#include <string.h>
#include <errno.h>//必須包含的頭文件
int main()
{
	FILE* pFile;
	pFile = fopen("unexist.ent", "r");
	if (pFile == NULL)
		printf("Error opening file unexist.ent: %s\n", strerror(errno));
	//errno: Last error number
	return 0;
}

輸出結(jié)果:

1.11 字符分類函數(shù)

字符轉(zhuǎn)換:

int tolower ( int c );
int toupper ( int c );
#include <stdio.h>
#include <ctype.h>
int main()
{
	int i = 0;
	char str[] = "Test String.\n";
	char c;
	while (str[i])
	{
		c = str[i];
		if (isupper(c))
			c = tolower(c);
		putchar(c);
		i++;
	}
	return 0;
}

輸出結(jié)果:

1.12 memcpy

void * memcpy ( void * destination, const void * source, size_t num );
  • 函數(shù)memcpysource的位置開(kāi)始向后復(fù)制num個(gè)字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
  • 這個(gè)函數(shù)在遇到 '\0'的時(shí)候并不會(huì)停下來(lái)。
  • 如果sourcedestination有任何的重疊,復(fù)制的結(jié)果都是未定義的
#include <stdio.h>
#include <string.h>
struct {
	char name[40];
	int age;
} person, person_copy;
int main()
{
	char myname[] = "Pierre de Fermat";
	/* using memcpy to copy string: */
	memcpy(person.name, myname, strlen(myname) + 1);
	person.age = 46;
	/* using memcpy to copy structure: */
	memcpy(&person_copy, &person, sizeof(person));
	printf("person_copy: %s, %d \n", person_copy.name, person_copy.age);
	return 0;
}

輸出結(jié)果:

1.13 memmove

void * memmove ( void * destination, const void * source, size_t num );
  • memcpy的差別就是memmove函數(shù)處理的源內(nèi)存塊和目標(biāo)內(nèi)存塊是可以重疊的
  • 如果源空間和目標(biāo)空間出現(xiàn)重疊,就得使用memmove函數(shù)處理
#include <stdio.h>
#include <string.h>
int main()
{
	char str[] = "memmove can be very useful......";
	memmove(str + 20, str + 15, 11);
	puts(str);
	return 0;
}

輸出結(jié)果:

1.14 memcmp

int memcmp ( const void * ptr1, 
 const void * ptr2, 
 size_t num );
  • 比較從ptr1和ptr2指針開(kāi)始的num個(gè)字節(jié)
  • 返回值如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char buffer1[] = "DWgaOtP12df0";
	char buffer2[] = "DWGAOTP12DF0";
	int n;
	n = memcmp(buffer1, buffer2, sizeof(buffer1));
	if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2);
	else if (n < 0) printf("'%s' is less than '%s'.\n", buffer1, buffer2);
	else printf("'%s' is the same as '%s'.\n", buffer1, buffer2);
	return 0;
}

輸出結(jié)果:

二、庫(kù)函數(shù)的模擬實(shí)現(xiàn)

2.1 模擬實(shí)現(xiàn)strlen

三種方式:

方式1:

//計(jì)數(shù)器方式
int my_strlen(const char* str) 
{
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

方式2:

//不能創(chuàng)建臨時(shí)變量計(jì)數(shù)器
int my_strlen(const char * str) 
{
	if(*str == '\0')
		return 0;
	else
		return 1+my_strlen(str+1);
}

方式3:

//指針-指針的方式
int my_strlen(char *s) 
{
    char *p = s;
    while(*p != ‘\0' )
        p++;
    return p-s; 
}

2.2 模擬實(shí)現(xiàn)strcpy

參考代碼:

//1.參數(shù)順序
//2.函數(shù)的功能,停止條件
//3.assert
//4.const修飾指針
//5.函數(shù)返回值
//6.題目出自《高質(zhì)量C/C++編程》書籍最后的試題部分
char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

2.3 模擬實(shí)現(xiàn)strcat

參考代碼:

char* my_strcat(char* dest, const char* src) 
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++))
	{
		;
	}
	return ret;
}

2.4 模擬實(shí)現(xiàn)strstr

參考代碼:

char* strstr(const char* str1, const char* str2) 
{
	char* cp = (char*)str1;
	char* s1, * s2;
	if (!*str2)
		return((char*)str1);
	while (*cp)
	{
		s1 = cp;
		s2 = (char*)str2;
		while (*s1 && *s2 && !(*s1 - *s2))
			s1++, s2++;
		if (!*s2)
			return(cp);
		cp++;
	}
	return(NULL);
}

2.5 模擬實(shí)現(xiàn)strcmp

參考代碼:

int my_strcmp(const char* src, const char* dst) 
{
	int ret = 0;
	assert(src != NULL);
	assert(dest != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
		++src, ++dst;
	if (ret < 0)
		ret = -1;
	else if (ret > 0)
		ret = 1;
	return(ret);
}

2.6 模擬實(shí)現(xiàn)memcpy

參考代碼:

void* memcpy(void* dst, const void* src, size_t count) 
{
	void* ret = dst;
	assert(dst);
	assert(src);
	/*
	 * copy from lower addresses to higher addresses
	 */
	while (count--) {
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return(ret);
}

2.7 模擬實(shí)現(xiàn)memmove

參考代碼:

void* memmove(void* dst, const void* src, size_t count) 
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count)) 
	{
		/*
		 * Non-Overlapping Buffers
         * copy from lower addresses to higher addresses
         */
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else {
		/*
		 * Overlapping Buffers
		 * copy from higher addresses to lower addresses
		 */
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--) {
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
	return(ret);
}

總結(jié)

到此這篇關(guān)于C語(yǔ)言進(jìn)階教程之字符函數(shù)和字符串函數(shù)的文章就介紹到這了,更多相關(guān)C語(yǔ)言字符函數(shù)和字符串函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Matlab繪制中國(guó)地圖超全教程詳解

    Matlab繪制中國(guó)地圖超全教程詳解

    這篇文章主要介紹了如何利用Matlab繪制中國(guó)地圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-02-02
  • C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++之try catch 異常處理入門實(shí)例

    C++之try catch 異常處理入門實(shí)例

    我們通常希望自己編寫的程序能夠在異常的情況下也能作出相應(yīng)的處理,而不至于程序莫名其妙地中斷或者中止運(yùn)行了。在設(shè)計(jì)程序時(shí)應(yīng)充分考慮各種異常情況,并加以處理
    2018-01-01
  • c語(yǔ)言描述回文數(shù)的三種算法

    c語(yǔ)言描述回文數(shù)的三種算法

    這篇文章主要介紹了c語(yǔ)言描述回文數(shù)的三種算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明

    C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明

    這篇文章主要介紹了C++返回值是類名和返回值是引用的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++ HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能

    C++ HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能

    本文主要介紹了HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • C++實(shí)現(xiàn)順序表的方法

    C++實(shí)現(xiàn)順序表的方法

    本文給大家?guī)?lái)了C++實(shí)現(xiàn)順序表的方法,代碼簡(jiǎn)單易懂,附有注釋,感興趣的朋友一起看下吧
    2016-08-08
  • C++中std::distance使用方法示例

    C++中std::distance使用方法示例

    std::distance?是 C++ 標(biāo)準(zhǔn)庫(kù)中的一個(gè)函數(shù),用于計(jì)算兩個(gè)迭代器之間的距離,本文主要介紹了C++中std::distance使用方法示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • 深入理解C語(yǔ)言指針

    深入理解C語(yǔ)言指針

    關(guān)于指針,其是C語(yǔ)言的重點(diǎn),C語(yǔ)言學(xué)的好壞,其實(shí)就是指針學(xué)的好壞。其實(shí)指針并不復(fù)雜,學(xué)習(xí)指針,要正確的理解指針
    2020-02-02
  • 使用C++17實(shí)現(xiàn)JSON庫(kù)設(shè)計(jì)思路示例全解

    使用C++17實(shí)現(xiàn)JSON庫(kù)設(shè)計(jì)思路示例全解

    這篇文章主要為大家介紹了使用C++17實(shí)現(xiàn)JSON庫(kù)設(shè)計(jì)思路示例全解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

贵溪市| 百色市| 广河县| 三门峡市| 南昌市| 乌兰浩特市| 稷山县| 江北区| 洪洞县| 鲁山县| 宁乡县| 永善县| 锡林浩特市| 炎陵县| 金堂县| 垦利县| 凯里市| 禄劝| 徐州市| 无锡市| 游戏| 铁岭县| 科尔| 定兴县| 萨迦县| 东乡县| 乌拉特后旗| 平邑县| 深圳市| 西丰县| 米脂县| 小金县| 张北县| 大方县| 娱乐| 泸定县| 仪征市| 多伦县| 南漳县| 开平市| 邛崃市|