c语言进阶-第3节-字符函数和字符串函数

c语言进阶-第3节-字符函数和字符串函数,第1张

c语言进阶-第3节-字符函数字符串函数 1.strlen函数 1.1.strlen函数介绍
size_t  strlen  ( const char * str );
1. 字符串以  '' 作为结束标志, strlen 函数返回的是在字符串中 '' 前面出现的字符个数(不包 含 '' ) 2. 参数指向的字符串必须要以 '' 结束。 3.注意函数的返回值为 size_t ,是无符号的( 易错 )
#include
#include

int main()
{
    int len=strlen("abcdef");
    printf("%dn",len);

    return 0;
}

1.2.strlen函数模拟实现
模拟实现方法: 1.计数器的方法 2.递归方法 3.指针-指针
模拟实现1:(计数器的方法)
#include

int my_strlen(const char* str) 
{
    assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	int len = my_strlen("abcdef");
	printf("%dn", len);

	return 0;
}

注:

1. *** 作符sizeof的返回类型其实是size_t类型的,size_t类型本质上是unsigned_int类型 2.用size_t来接收strlen函数的返回值有好处也有不好的地方,好处是长度一定是一个正数,用无符号整型接收更合理,坏处如下图所示,用无符号返回值进行计算,使用时不顺手,易引入bug。

模拟实现2:(递归方法)

#include

int my_strlen(const char* str) 
{
    assert(str);
	if (*str == '')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}

int main()
{
	int len = my_strlen("abcdef");
	printf("%dn", len);

	return 0;
}

模拟实现3:(指针-指针)

#include

int my_strlen(char* s) 
{
    assert(str);
	char* p = s;
	while (*p != '')
		p++;
	return p - s;
}

int main()
{
	int len = my_strlen("abcdef");
	printf("%dn", len);

	return 0;
}

2.strcpy函数 2.1.strcpy函数介绍
char*   strcpy ( char * destination , const char * source )
源字符串必须以 '' 结束 会将源字符串中的 '' 拷贝到目标空间 目标空间必须足够大,以确保能存放源字符串 目标空间必须可变(只读数据区的内容不可更改)
#include
#include

int main()
{
    char arr1[]="abcdef";
    char arr2[20]={0};
    strcpy(arr2,arr1);
    printf("%sn",arr2);

    return 0;
}

2.2.strcpy函数模拟实现 模拟实现1:
#include
#include 
#include 

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

int main()
{
	char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f', ''};
	char arr2[20] = "xxxxxxxxxxxx";

	my_strcpy(arr2, arr1);
	
	printf("%sn", arr2);


	return 0;
}

模拟实现2:(改进版)

#include
#include 
#include 

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

int main()
{
	char arr1[] = {'a', 'b', 'c', 'd', 'e', 'f', ''};
	char arr2[20] = "xxxxxxxxxxxx";

	my_strcpy(arr2, arr1);
	
	printf("%sn", arr2);

	return 0;
}

3.strcat函数 3.1.strcat函数介绍
char * strcat ( char * destination , const char * source );
功能:将源字符串的内容追加到目标字符串的后面 源字符串必须以 '' 结束。 目标空间必须有足够的大,能容纳下源字符串的内容。 目标空间必须可修改。
#include
#include

int main()
{
    char arr1[30]="hello";
    char arr2[]="word";
    strcat(arr1,arr2);
    printf("%sn",arr1);

    return 0;
}

3.2.strcat函数模拟实现 模拟实现:
#include
#include
#include

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1. 目标空间中的
	while (*dest)
	{
		dest++;
	}
	//2. 追加内容到目标空间
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[30] = "hello";
	char arr2[] = "world";

    my_strcat(arr1, arr2);
	printf("%sn", arr1);

	return 0;
}

注:

1.若想知道编译器函数库中某函数是怎样实现的,通过以下步骤可观察(以strcat函数为例)

步骤一:打开everything,搜索该函数名,找到.c文件

 步骤二:单机鼠标右键,点击打开路径

 步骤三:找到.c文件所在文件夹,将该文件拖入vs编译器窗口

 步骤四:这里就是函数库中要找函数的实现代码


4.strcmp函数 4.1.strcmp函数介绍
int strcmp ( const char * str1 , const char * str2 );
功能:比较对应位置上的字符大小
标准规定: 第一个字符串大于第二个字符串,则返回大于 0 的数字 第一个字符串等于第二个字符串,则返回 0 第一个字符串小于第二个字符串,则返回小于 0 的数字
#include
#include

int main()
{
    char arr1[30]="abcdef";
    char arr2[]="abq";

    int ret=strcmp(arr1,arr2);
    printf("%dn",ret);

    return 0;
}

4.2.strcmp函数模拟实现 模拟实现1:
#include
#include
#include

int my_strcmp(const char* str1, const char*str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '')
			return 0;
		
		str1++;
		str2++;
	}

	if (*str1 > *str2)
		return 1;
	else
		return -1;
}

int main()
{
	char arr1[] = "abc";
	char arr2[] = "abc";

	int ret = my_strcmp(arr1, arr2);

	if (ret<0)
	{
		printf("arr10)
	{
		printf("arr1>arr2");
	}
	else
	{
		printf("arr1==arr2");
	}

	return 0;
}

注:

此处,在主函数打印时,一定不能用-1、1、0进行判断,因为标准规定返回值是一个>0、<0、=0的值(其他编译器就不一定是只返回-1、1、0三个了数字),下面就是错误的例子。

 模拟实现2:

#include
#include
#include

int my_strcmp(const char* str1, const char*str2)
{
	assert(str1 && str2);
	while (*str1 == *str2)
	{
		if (*str1 == '')
			return 0;
		
		str1++;
		str2++;
	}

	return *str1 - *str2;

}

int main()
{
	char arr1[] = "abc";
	char arr2[] = "abc";

	int ret = my_strcmp(arr1, arr2);

	if (ret<0)
	{
		printf("arr10)
	{
		printf("arr1>arr2");
	}
	else
	{
		printf("arr1==arr2");
	}

	return 0;
}

5.strncpy函数
char * strncpy ( char * destination , const char * source , size_t num );
拷贝 num 个字符从源字符串到目标空间 如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个

代码1:

#include
#include

int main()
{
    char arr1="xxxxxxxxxxxxxxxx";
    char arr2[]="hello word";

    strncpy(arr1,arr2,5);
    printf("%sn",arr1);

    return 0;
}

运行结果1:

代码2:

#include
#include

int main()
{
    char arr1[] = "xxxxxxxxxxxxxx";
    char arr2[] = "he";

    strncpy(arr1, arr2, 5);
    printf("%sn", arr1);

    return 0;
}

运行结果2:

运行调试2:


6.strncat函数
char * strncat ( char * destination , const char * source , size_t num );
strncat函数对目标字符串进行追加,有两种情况 1. 若源字符串的长度小于等于 num: 遇到源字符串的停止,只将源字符串进行追加完即可(与strncpy函数不同) 2. 若源字符串的长度大于 num:追加源字符串的num个字符,然后在追加的最后一个字符后面补一个
代码1:
#include
#include

int main()
{
    char arr1[20]="hello";
    char arr2[]="word";

    strncat(arr1,arr2,5);
    printf("%sn",arr1);

    return 0;
}

运行结果1:

 代码2:

#include
#include

int main()
{
    char arr1[20] = "hello";
    char arr2[] = "word";

    strncat(arr1, arr2, 2);
    printf("%sn", arr1);

    return 0;
}

运行结果2:

代码3:

#include
#include

int main()
{
    char arr1[20] = "helloxxxxxxxxx";
    char arr2[] = "word";

    strncat(arr1, arr2, 3);
    printf("%sn", arr1);

    return 0;
}

运行结果3:

运行调试3:

 代码4:

#include
#include

int main()
{
    char arr1[20] = "helloxxxxxxxxx";
    char arr2[] = "word";

    strncat(arr1, arr2, 7);
    printf("%sn", arr1);

    return 0;
}

运行结果4:

 

运行调试4:

 


7.strncmp函数
int strncmp ( const char * str1 , const char * str2 , size_t num );
标准规定: 第一个字符串大于第二个字符串,则返回大于 0 的数字 第一个字符串等于第二个字符串,则返回 0 第一个字符串小于第二个字符串,则返回小于 0 的数字
代码1:
#include
#include

int main()
{
    char arr1[]="abcdef";
    char arr2[]="abcqqqqqq";

    int ret=strncmp(arr1,arr2,3);
    printf("%dn",ret);

    return 0;
}

运行结果1:

代码2:

#include
#include

int main()
{
    char arr1[]="abcdef";
    char arr2[]="abcqqqqqq";

    int ret=strncmp(arr1,arr2,4);
    printf("%dn",ret);

    return 0;
}

运行结果2:

 代码3:

#include
#include

int main()
{
    char arr1[] = "abcwef";
    char arr2[] = "abcqqqqqq";

    int ret = strncmp(arr1, arr2, 4);
    printf("%dn", ret);

    return 0;
}

运行结果3:

 


8.strstr函数  8.1.strstr函数介绍
char * strstr ( const char * str1 , const char * str2 );
功能:在str1字符串中找str2字符串。若找到str2了,返回str2第一次出现的起始地址;若找不到str2,返回一个空指针。
代码1:
#include
#include

int main()
{
    char arr1[]="abcdefabcdef";
    char arr2[]="bcd";

    char* ret=strstr(arr1,arr2);

    if(NULL==ret)
    printf("没找到n");
    else
    printf("%sn",ret);

    return 0;
}

运行结果1:

 代码2:

#include
#include

int main()
{
    char arr1[] = "abcdefabcdef";
    char arr2[] = "bcdq";

    char* ret = strstr(arr1, arr2);

    if (NULL == ret)
        printf("没找到n");
    else
        printf("%sn", ret);

    return 0;
}

运行结果2:

8.2.strstr函数模拟实现

模拟实现:

#include
#include
#include

char* my_strstr(const char* str, const char* substr)
{
	const char* s1 = str;
	const char* s2 = substr;
	const char* cur = str;

	assert(str && substr);
	if (*substr == '')
	{
		return (char*)str;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = substr;
		while (*s1!='' && *s2!='' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '')
			return (char*)cur;

		cur++;
	}
	return NULL;
}


int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";

	char* ret = my_strstr(arr1, arr2);

	if (NULL == ret)
		printf("没找到n");
	else
		printf("%sn", ret);

	return 0;
}

9.

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

原文地址: https://www.outofmemory.cn/zaji/5713818.html

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

发表评论

登录后才能评论

评论列表(0条)

保存