【C】字符函数和内存函数(手动实现,函数详解)

【C】字符函数和内存函数(手动实现,函数详解),第1张

【C】字符函数和内存函数(手动实现,函数详解)

目录

前言

        一、strlen

        二、strcpy

        三、strcat

        四、strcmp

        五、strncpy

        六、strncat

        七、strncmp

        八、strstr

        九、strtok

        十、strerror

        十一、memcpy

        十二、memmove

        十三、memcmp

        十四、字符分类函数:

总结


前言

        本章节为字符串进阶内容,包含了常见字符函数和字符串函数,易错点都已经标出来了。


一、strlen
 size_t  strlen( const char*  str)

功能:计算字符串长度,不包含'‘输入:字符串地址返回值:函数返回值一定是size_t ,是无符号的注意:sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个 *** 作符,strlen()是函数模拟实现

int my_strlen(const char* str)
{
	assert(str != NULL);
	int consut = 0;
	while (*str != '')
	{
		consut++;
		str++;
	}
	return consut;
}
二、strcpy
char* strcpy(char* dest,char* src)

功能:将src拷贝到dest中输入:目标字符串地址,源字符串地址返回值:dest的起始地址注意:确保目标地址空间足够大,源字符串必须''结尾,会将源字符中的''拷贝到目标字符串中模拟实现

char* my_strcpy(char* str, const char* sub)
{
	assert(*str != NULL && *sub != NULL);
	char* ret = str;
	while (*str = *sub)
	{
		str++;
		sub++;
	}
	return ret;
}
三、strcat
char* strcat(char* dest,const char* src)

功能:将src拼接到dest之后输入:目标字符串地址,源字符串地址返回值:dest的起始地址注意:dest最后的结束字符’’会被覆盖掉,并在连接后的字符串的尾部再增加一个’’,dest要有足够的空间来容纳要复制的字符串,源字符串必须以 '' 结束。模拟实现

char* my_strcat(char* str, const char* sub)
{
	char* cmp = str;
	while (*str)
	{
		str++;
	}
	while (*str = *sub)
	{
		str++;
		sub++;
	}
	return cmp;
}
四、strcmp
int strcmp (const char* s1,const char* s2)

功能:将s1与s2t比较输入:s1和s2返回值:若s1和s2字符串相同返回0,s1若大于s2则返回大于0,s1若小于s2则返回小于0注意:判断两个字符串大小1)ASII码 2)长度模拟实现

int my_strcmp(const char* str, const char* sub)
{
	assert(*str != NULL && *sub != NULL);
	if (*str == NULL || *sub == NULL)
	{
		return 0;
	}
	while (*str == *sub )
	{
		if (*str == '')
		{
			return 0;
		}
		str++;
		sub++;
	}
	if (*str > *sub)
	{
		return 1;
	}
	else if (*str < *sub)
	{
		return -1;
	}
	else
	{
		return 0;
	}
}
五、strncpy
char* strncpy(char* dest,const char* src,size_t num)

功能:拷贝src字符串的前num个字符至dest输入:dest地址src地址和需要拷贝的字符个数返回值:dest字符串起始地址注意:strncpy不会向dest追加’’,dest必须有足够的空间放置n个字符 六、strncat

char* strncat (char* dest,const char* src,size_t num)

功能:将n个字符追加到字符串结尾输入:dest地址src地址和需要拼接的字符个数返回值:dest字符串起始地址注意:strncat会将dest字符串最后的’’覆盖掉,字符追加完成后,再追加’’ 七、strncmp

int strncmp(const char* str1,const char* str2,size_t num)

功能:指定长度比较输入:dest地址src地址和需要比较的字符个数返回值:同strcmp一样注意:同strcmp一样 八、strstr

char* strstr(const char* str,const char* substr)

功能:检索子串在字符串中首次出现的位置输入:str和substr的地址返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL使用示范:

​​​​​
#include 
#include 
int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = strstr(str, "simple");
    strncpy(pch, "sample", 6);
    puts(str);
    return 0;
}

​

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

功能:根据分隔符将字符串分隔成一个个片段输入:str为源字符串,sep参数是个字符串,定义了用作分隔符的字符集合返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL注意:当strtok在参数s的字符串中发现到参数sep的分割字符时则会将该字符改为’’字符。

在第一次调用时,strtok必须赋予参数str字符串,往后的调用则将参数str设置成NULL,直到str指向NULL停止

#include 
int main()
{
    char* p = "woshinidie#baba,dong?";
    const char* sep = "#,";
    char arr[30];
    char* str = NULL;
    strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容
    for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
    {
        printf("%sn", str);
    }
}

十、strerror
char * strerror ( int errnum );

功能:返回错误码输入:errno信息返回值:返回错误码注意:必须包含string.h和errno.h

#include 
#include 
#include //必须包含的头文件
int main ()
{
    FILE * pFile;
    pFile = fopen ("unexist.ent","r");
    if (pFile == NULL)
        printf ("Error opening file unexist.ent: %sn",strerror(errno));
    //errno: Last error number
    return 0;
}
十一、memcpy
void * memcpy ( void * destination, const void * source, size_t num )

功能:任何类型的拷贝输入:dest为目标函数,src为源函数,num为拷贝字符数量返回值:dest地址模拟实现:遇到''不会停下来,,不可以源内容和目标内容重叠。当每次解引用完后dest和src的类型还是void*所以,必须再次char*

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest;
	assert(dest != NULL && src != NULL);
	while (num--)
	{
		*(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 )

功能:任何类型的拷贝输入:dest为目标函数,src为源函数,num为拷贝字符数量返回值:dest地址模拟实现:遇到''不会停下来,,可以源内容和目标内容重叠。当每次解引用完后dest和src的类型还是void*所以,必须再次char*。当dest < src时,必须从后向前拷贝,当dest > src时,必须从前向后拷贝。

void* my_memmove(char* dest, const char* src, size_t num)
{
	void* ret = dest;
	assert(dest != NULL && src != NULL);
	if (dest < src)
	{
		while (num--)
		{
			*(char*)dest = *(char*)src;
			dest = (char*)dest + 1;
			src = (char*)src + 1;
		}
	}
	else
	{
		while (num--)
		{
			*((char*)dest + num) = *((char*)src + num);
		}
	}
	return ret;
}
十三、memcmp
int memcmp ( const void * ptr1,
            const void * ptr2,
            size_t num )

功能:比较从ptr1和ptr2指针开始的num个字节输入:ptr1为目标函数, ptr2为源函数,num为比较字符数量返回值:ptr1和ptr2字符串相同返回0,ptr1大于ptr2则返回大于0,s1小于s2则返回小于0使用示范:

#include 
#include 
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;
}
十四、字符分类函数: 函数如果他的参数符合下列条件就返回真iscntrl任何控制字符isspace空白字符:空格‘ ’,换页‘f’,换行'n',回车‘r’,制表符't'或者垂直制表符'v'isdigit十进制数字 0~9isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~Fislower小写字母a~zisupper大写字母A~Zisalpha字母a~z或A~Zisalnum字母或者数字,a~z,A~Z,0~9ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)isgraph任何图形字符isprint任何可打印字符,包括图形字符和空白字符
总结

        算上今天还有27天就开学了,想想在家里呆了有15天了,虽然大部分时间都是在自我学习和学习他人,但有时候就感觉,别人都好努力呀,自己是不是因该再努力一点,但这样尝试之后自己会变得好累,但我就想再坚持一下就好了,希望自己还是能多关注一下自己的节奏吧,慢慢来,一切都会变得更好的。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5713348.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-17
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存