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

C語言詳細(xì)分析常見字符串函數(shù)與模擬實(shí)現(xiàn)

 更新時(shí)間:2022年03月30日 10:52:34   作者:二球懸鈴木丶  
字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長度,字符查找等的函數(shù)

一. strlen(求長度)

size_t  strlen ( const char * str )

函數(shù)的返回值類型為size_t,為無符號數(shù),且strlen返回值為字符串中‘\0’前的字符個(gè)數(shù)。

猜猜這個(gè)程序的輸出

if (strlen("abc") - strlen("abcdef"))
	{
		printf(">");
	}
	else
	{
		printf("<");
	}

沒錯(cuò),是 > 

因?yàn)閟trlen的返回值為無符號數(shù),-3變成了一個(gè)很大的正整數(shù)。

二. strcpy(拷貝)

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

使用時(shí),源字符串必須以\0結(jié)尾,并且'\0'也會拷過去

strcpy:"我不管你放不放得下,我就拷。" 

目標(biāo)地址必須夠大且可修改,不然的話,雖然可以放進(jìn)去,但是程序會崩潰

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

char* my_strcpy(char* dest,const char* source)
{
	assert(dest && source);
	char* ret = dest;
	while (*dest++ = *source++);
	return ret;
}

三.strcat(追加)

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

源字符串必須有'\0',目標(biāo)字符串也得有'\0' 

追加后,目標(biāo)空間的'\0'無了,源字符串的'\0'添加上

目標(biāo)地址必須夠大且可修改

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

char* my_strcat(char* dest,char* source)
{
	assert(dest && source);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *source++);
	return ret;
}

四.strcmp

int strcmp(const char* string1, const char * string2)

strcmp函數(shù)比較的不是字符串的函數(shù)長度`

而是比較字符串中對應(yīng)位置上的字符的大小,如果相同,就比較下一對字符,知道不同,或者遇到'\0'.

若相同則返回0,若大于則返回大于零的數(shù)。若小于則返回小于零的數(shù)

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

int my_strcmp(const char* str, const char* qtr)
{
	assert(str && qtr);
	while (*str == *qtr)
	{
		if (*str == '\0')
			return 0;
		str++;
		qtr++;
	}
	if (*str > *qtr)
		return 1;
	else
		return -1;
}

五.strncpy

char * strncpy ( char * dest, const char * source , size_t count)

作用是將源字符串的前count個(gè)字符拷貝到目標(biāo)字符串

char a[] = "abcd";
char b[] = "qwer";
strncpy(a,b,1);

如以上修改后字符串為qbcd

strncpy的模擬實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS 1
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
 
void my_strncat(char*dest,char*src,size_t n)
{
	int t = strlen(dest);
	int f = strlen(src);
	for (int i = 0; i < n; i++)
	{
		*(dest + i) = *src;
		src++;
	}
}
 
 
 
int main()
{
	int n;
	scanf("%d", &n);
	char src[50], dest[50];
	strcpy(dest, "NICE");
	strcpy(src, "SHOOT");
	my_strncat(dest,src,n);
	printf("%s", dest);
}

六.strncat

char * strncat ( char * dest , const char * source ,size_t  count) 

作用是將源字符串的前count個(gè)字符追加到dest后面、

并且會在結(jié)尾加上‘\0’

char arr1[]="abcdef\0xx";
char arr2[]="qwer";
strncat(arr1,arr2,2);

修改后為abcdefqw

strncat的模擬實(shí)現(xiàn)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strncpy(char* str, char* qtr, int size)
{
	assert(str && qtr);
	int t = strlen(str);
	for (int i = 0; i < size ; i++)
	{
		*(str + t + i) = *qtr;
		qtr++;
	}
	*(str + t + size) = '\0';
}
int main()
{
	char src[50], dest[50];
	strcpy(src, "A nice");
	strcpy(dest, " BOYYYYYYY");
	int n = 0;
	scanf("%d", &n);
	my_strncpy(src, dest, n);
	printf("%s", src);
}

七.strncmp

int strncm ( const char * str , const char * qtr , size_t num )

指定比較前num個(gè)字符,其他同strcmp一樣

八.strstr

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

用于查找子串,返回第一次找到的地址

 九.strtok

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

參數(shù)sep是由分隔符組成的一個(gè)字符串

str為一個(gè)字符串,包含sep中零個(gè)或者多個(gè)分隔符.

strtok會找到str中第一個(gè)分隔符,并把其替換成'\0',返回一個(gè)指向這個(gè)分隔符的指針

若第一個(gè)參數(shù)為'\0'',則從上一波保存的位置向后查找另一個(gè)分隔符

若字符串中不存在更多的分隔符,則返回NULL指針

	char a[] = "A@nice.boy";
	char sep[] = "@.";
	printf("%s", strtok(a, sep));
	printf("%s", strtok(NULL, sep));

如以上結(jié)果為Anice

    char a[] = "A@nice.boy";
	const char sep[] = "@.";
	char arr[30];
	char* str = NULL;
	strcpy(arr, a);
	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
	{
		printf("%s", str);
	}

以上輸出為Aniceboy

十.strerror

char * strerror (int errnum )

errno是一個(gè)全局變量,記錄最后的錯(cuò)誤代碼,程序剛剛啟動(dòng)的時(shí)候,errno 被設(shè)置為 0;程序在運(yùn)行過程中,任何一個(gè)函數(shù)發(fā)生錯(cuò)誤都有可能修改 errno 的值,讓其變?yōu)橐粋€(gè)非零值,用以告知用戶發(fā)生了特定類型的錯(cuò)誤。

十一.memcpy

void * memcpy ( void* dest , const void * source ,size_t count)

作用是將源字符串的前count個(gè)字節(jié)拷貝到dest上

int a1[20] = {1,2,3,4,5,6,7,8};
int a2[5] = {0};
memcpy(a1,a2,20);

執(zhí)行后,a1數(shù)組前五個(gè)元素變成0

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

由于memcpy的拷貝是一個(gè)字節(jié)一個(gè)字節(jié)進(jìn)行的

可用以下代碼模擬實(shí)現(xiàn)

void* my_memcpy(void* dest, const void* source, size_t count)
{
	assert(source && dest);
	void* ret = dest;
	while (count--)
	{
		*(char*)dest = *(char*)source;
		source=(char*)source+1;
		dest=(char*)dest+1;
	}
	return ret;
}

十二.memmove

void * memmove (void * dest ,const void * source ,size_t count)

可以實(shí)現(xiàn)重疊內(nèi)存拷貝

模擬實(shí)現(xiàn):

void* my_memmove(void* dest, const void* source, size_t count)
{
	if (dest < source)
	{
		while(count--)
		{
		*(char*)dest = *(char*)source;
		dest = (char*)dest + 1;
		source = (char*)source + 1;
		}
	}
	else
	{
		while (count--)
		{
			*((char*)dest + count )= *((char*)source + count);
		}
	}
}

十三.memcmp

void * memcpy ( void * str , const void * qtr , size_t count)

比較str和qtr的前count個(gè)字節(jié),注意是一個(gè)字節(jié)一個(gè)字節(jié)比較

這就很有意思了

請看以下代碼

int a[5] = { 1,2,3,4,5 };
int b[5] = { 1,2,3,4,0x11223305};
memcmp(a,b,16);

很明顯數(shù)組的前十六個(gè)字節(jié)相同,會返回0,但如果是前十七個(gè)呢

這是因?yàn)?nbsp;      

5存儲為  05 00 00 00 

0x11223305為   05 33 22 11

十四.memset

void * memset ( void * dest , int c ,size_t count)

作用是將前count個(gè)字節(jié)改成參數(shù)c

int a[]={0,0x22222222};
memset(a,1,8);

如以上a數(shù)組變?yōu)?x01010101,0x0101010101

到此這篇關(guān)于C語言詳細(xì)分析常見字符串函數(shù)與模擬實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語言 常見字符串函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++缺省參數(shù)的理解

    C++缺省參數(shù)的理解

    這篇文章主要為大家介紹了C++缺省參數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • C++中COM組件初始化方法實(shí)例分析

    C++中COM組件初始化方法實(shí)例分析

    這篇文章主要介紹了C++中COM組件初始化方法,涉及C++中COM組件的使用技巧,需要的朋友可以參考下
    2015-05-05
  • C++實(shí)現(xiàn)哈希散列表的示例

    C++實(shí)現(xiàn)哈希散列表的示例

    本文主要介紹了C++實(shí)現(xiàn)哈希散列表的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 一文詳解C++仿函數(shù)

    一文詳解C++仿函數(shù)

    本文主要介紹了一文詳解C++仿函數(shù),主要用途是提供一種靈活的方式來定義和操作數(shù)據(jù),下面就來介紹一下仿函數(shù)的使用,感興趣的可以了解一下
    2025-04-04
  • C語言示例講解if else語句的用法

    C語言示例講解if else語句的用法

    這篇文章主要介紹C語言中的If Else語句怎么使用,在日常操作中,相信很多人在If Else語句怎么使用問題上存在疑惑,小編查閱了各式資料,整理出使用方法,接下來,請跟著小編一起來學(xué)習(xí)吧
    2022-06-06
  • C語言實(shí)現(xiàn)二叉樹層次遍歷介紹

    C語言實(shí)現(xiàn)二叉樹層次遍歷介紹

    大家好,本篇文章主要講的是C語言實(shí)現(xiàn)二叉樹層次遍歷介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言輸入三角形邊長判斷其類型并輸出面積實(shí)例代碼

    C語言輸入三角形邊長判斷其類型并輸出面積實(shí)例代碼

    這篇文章主要介紹了C語言輸入三角形邊長判斷其類型并輸出面積實(shí)例代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • 復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼

    復(fù)數(shù)乘法中的結(jié)構(gòu)體賦值實(shí)現(xiàn)代碼。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • C++基于hook iat改變Messagebox實(shí)例

    C++基于hook iat改變Messagebox實(shí)例

    這篇文章主要介紹了C++基于hook iat改變Messagebox的方法,以實(shí)例形式展示了針對IAT(即導(dǎo)入地址表)以及hook的操作,有助于深入理解Windows程序設(shè)計(jì)原理,需要的朋友可以參考下
    2014-10-10
  • 基于C語言指令的深入分析

    基于C語言指令的深入分析

    本篇文章是對C語言的指令進(jìn)行了詳細(xì)的分析與介紹,需要的朋友參考下
    2013-05-05

最新評論

乐清市| 利辛县| 喀喇| 五华县| 泸西县| 浙江省| 衡水市| 南陵县| 岳阳县| 杭州市| 赣榆县| 余姚市| 沙雅县| 屏山县| 樟树市| 赣榆县| 喜德县| 白银市| 藁城市| 巴青县| 襄垣县| 绥德县| 龙南县| 浦东新区| 友谊县| 八宿县| 邹平县| 博野县| 雅安市| 沿河| 蕲春县| 焉耆| 榆林市| 三明市| 宁陕县| 和静县| 潍坊市| 中山市| 扎囊县| 江陵县| 兴和县|