欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言進階教程之字符函數(shù)和字符串函數(shù)

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

前言

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

一、函數(shù)介紹

1.1 strlen

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

注:

#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é)束
  • 會將源字符串中的 '\0' 拷貝到目標空間
  • 目標空間必須足夠大,以確保能存放源字符串
  • 目標空間必須可變

1.3 strcat

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

1.4 strcmp

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

1.5 strncpy

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

1.6 strncat

char * strncat ( char * destination, const char * source, size_t num );
  • strncpystrcpy的改進一樣,strncat也是對strcat的改進,而且可以自我追加
  • 參數(shù)和strncpy無異
#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)另個字符不一樣或者一個字符串結(jié)束或者num個字符全部比較完
  • 也是對strcmp的改進
#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ù)是個字符串,定義了用作分隔符的字符集合
  • 第一個參數(shù)指定一個字符串,它包含了0個或者多個由sep字符串中一個或者多個分隔符分割的標記
  • strtok函數(shù)找到str中的下一個標記,并將其用 \0 結(jié)尾,返回一個指向這個標記的指針(注:strtok函數(shù)會改變被其操作的字符串,所以在使用strtok函數(shù)切分的字符串一般都是臨時拷貝的內(nèi)容并且可修改)
  • strtok函數(shù)的第一個參數(shù)不為 NULL ,函數(shù)將找到str中第一個標記,strtok函數(shù)將保存它在字符串中的位置
  • strtok函數(shù)的第一個參數(shù)為 NULL ,函數(shù)將在同一個字符串中被保存的位置開始,查找下一個標記
  • 如果字符串中不存在更多的標記,則返回 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的位置開始向后復制num個字節(jié)的數(shù)據(jù)到destination的內(nèi)存位置。
  • 這個函數(shù)在遇到 '\0'的時候并不會停下來。
  • 如果sourcedestination有任何的重疊,復制的結(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)存塊和目標內(nèi)存塊是可以重疊的
  • 如果源空間和目標空間出現(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指針開始的num個字節(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é)果:

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

2.1 模擬實現(xiàn)strlen

三種方式:

方式1:

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

方式2:

//不能創(chuàng)建臨時變量計數(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 模擬實現(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 模擬實現(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 模擬實現(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 模擬實現(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 模擬實現(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 模擬實現(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語言進階教程之字符函數(shù)和字符串函數(shù)的文章就介紹到這了,更多相關(guān)C語言字符函數(shù)和字符串函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中動態(tài)綁定和內(nèi)存管理的實現(xiàn)

    C++中動態(tài)綁定和內(nèi)存管理的實現(xiàn)

    本文主要介紹了C++中動態(tài)綁定和內(nèi)存管理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • C++四種case的詳細介紹小結(jié)

    C++四種case的詳細介紹小結(jié)

    本文主要介紹了C++四種case的詳細介紹小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • C語言全局變量和局部變量的示例代碼

    C語言全局變量和局部變量的示例代碼

    本文主要介紹了C語言全局變量和局部變量的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • 基于C++實現(xiàn)俄羅斯方塊游戲的示例代碼

    基于C++實現(xiàn)俄羅斯方塊游戲的示例代碼

    俄羅斯方塊(Tetris)是一款風靡全球的經(jīng)典益智游戲,自1984年首次發(fā)布以來,便吸引了無數(shù)玩家,在這篇博文中,我們將深入探討如何用 C++ 編寫一個簡單的俄羅斯方塊游戲,我們將從游戲的基本概念和設(shè)計入手,逐步實現(xiàn)游戲的各個功能模塊,感興趣小伙伴快來看看吧
    2024-11-11
  • 桶排序算法的理解及C語言版代碼示例

    桶排序算法的理解及C語言版代碼示例

    桶排序算法顧名思義,就是把要排序的元素分桶排序后合并結(jié)果,這里我們就來看一下桶排序算法的理解及C語言版代碼示例:
    2016-07-07
  • 一文讀懂C++ 虛函數(shù) virtual

    一文讀懂C++ 虛函數(shù) virtual

    這篇文章主要介紹了C++ 虛函數(shù) virtual的相關(guān)資料,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Qt創(chuàng)建并顯示柱狀圖的方法

    Qt創(chuàng)建并顯示柱狀圖的方法

    Qt Charts 模塊提供了一套易于使用的圖表組件,本文主要介紹了Qt創(chuàng)建并顯示柱狀圖,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 利用Matlab制作一款3D版2048小游戲

    利用Matlab制作一款3D版2048小游戲

    2048作為一款經(jīng)典的小游戲,相信很多人都玩過吧?但是3D版的2048不知道有沒有人玩過呢?本文將用Matlab制作一個3D版的2048小游戲,快跟隨小編一起動手試一試吧
    2022-02-02
  • C語言的合法標識符與整型詳解

    C語言的合法標識符與整型詳解

    這篇文章主要為大家詳細介紹了C語言的合法標識符與整,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 詳解C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法

    詳解C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法

    這篇文章主要介紹了C++的JSON靜態(tài)鏈接庫JsonCpp的使用方法,演示了使用JsonCpp生成和解析JSON的方法,以及C++通過JSON方式的socket通信示例,需要的朋友可以參考下
    2016-03-03

最新評論