前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >字符函数和字符串函数的使用及模拟实现(上)

字符函数和字符串函数的使用及模拟实现(上)

作者头像
The sky
发布2023-04-12 14:26:03
6290
发布2023-04-12 14:26:03
举报
文章被收录于专栏:C++的逆袭之路

前言

重点介绍处理 字符和字符串 的库函数的使用和注意事项

一、函数介绍

1.strlen

 strlen,是字符串长度的函数

返回类型为 size_t 及无符号整型unsigned int    因为字符串长度必定都为正数,不可能出现负数,所以将返回值设置为无符号数会更加合适。

参数为char *类型的指针   要求字符串的长度,应该将字符串的首地址传过去,所以参数为char*

2.注意事项:

     strlen返回类型为无符号整型,所以在比较两个字符串长度的时候,要格外注意!!

1.strlen ( str2 ) - strlen ( str1 ),其返回类型都是无符号整型,做运算时,结果自然也是无符号整型,原码反码补码都是一样的,结果永远为大于零的数。结果一直为  >.

2.strlen遇到字符串位置的 ‘\0’,会停下来,斜杠零之前字符个数,及字符串的长度!

     结果我们可知,在字符串存储时,斜杠零会自动在字符串的结尾处添加,但若单独存字符的话,是没有斜杠零存储进去的,所以会出现arr2长度为18的情况!

     申请内存时,它的前后都是有其他内存空间的,所以我们不保证其他空间中,是否有斜杠零,所以strlen(arr2)=16结果是随机值!


2.strcpy

 Copy a string,显而易见,拷贝字符串

返回类型char *指针,参数为目的字符串的地址,源字符串的地址

                                  及(源字符串要拷贝到目的字符串中)

2.注意事项

1.源字符串中必须要有斜杠零,当拷贝过程中,遇到斜杠零会停止拷贝!

2. 会将源字符串中的 '\0' 拷贝到目标字符串中

3.要注意,目的字符串的空间一定要大于源字符串空间,不然会报错,拷贝失败!


3.strcat

 Append a string.     append增补,追加

追加字符串

返回类型 char *,返回目的字符串的地址

参数,目的字符串地址和源字符串地址,类型都为char *。

2.注意事项

1.source字符串  追加在 dest字符串中,在目的字符串斜杠零位置开始追加,追加结束后,会自动带一个斜杠零。

 2.目的字符串空间要大,足够追加!

3.源字符串中,必须要有斜杠零。

4.你是不是有自己追加自己的这种想法?当然不行!

追加过程中,会将源字符串中的斜杠零覆盖掉,导致字符串中没有斜杠零,即没有停止的位置,会一直死循环下去!

4.strcmp

compare string,比较字符串

返回类型为int

参数为 字符串1 和 字符串2 的地址,类型为char* 

比较规则

举例一:

举例二:

是不是看出一些眉目?比较字符串当然不是看字符串的长度!比较的是每一对字符的大小,ASCII码值的大小

第一个例子:

第一对相等'a'= 'a',第二对 'a'< 'b' ,所以字符串2大于字符串1,后面的无需比较。

第二个例子明白了吧!



长度受限的字符串函数

5.strncpy

多增加了一个字节个数,即拷贝几个字节,更加有了限制

这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

6.strncat

多增加了一个字节个数,即追加几个字节,更加有了限制

这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

7.strncmp

多增加了一个字节个数,即比较几个字节,更加有了限制

这样会更多考虑源字符串和目的字符串的空间大小,更加的严谨!!

二、模拟实现

1.strlen

代码如下(示例):

法一:计数器方式

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
int my_strlen(char* p)
{
	assert(str);   //防止str为空指针
	int count = 0;
	while (*p++)
	{
		count++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d", ret);
    return 0;
}

法二:递归,不创建临时变量

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
int my_strlen(char *str)
{
	if (*str== '\0')
	{
		return 0;
	}
	else
	{
		return my_strlen(str+1) + 1;
	}
}
int main()
{
	char arr[] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d", ret);
}

法三:指针减指针

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
int my_strlen(char* str)
{
	char* p = str;
	while (*p!= '\0')
	{
		p++;
	}
	return p - str;
}
int main()
{
	char arr[] = "abcdef";
	int ret = my_strlen(arr);
	printf("%d", ret);
}

2.strcpy

代码如下(示例):

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
char * my_strcpy(char* dest, const char* src)
{
	assert(dest && src);
	char* p = dest;
	while (*dest++ = *src++);
return p;
}
int main()
{
	char arr1[] = "aaaaaaaaa";
	char arr2[] = "bbbbbbbb";
	my_strcpy(arr1,arr2);
	printf("%s", arr1);
}

3.strcat

代码如下(示例):

先找斜杠零,再拷贝.

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest,const char* src)
{
	char* p = dest;
	assert(dest && src);
	while (*dest)
	{
		dest++;
	}
	while (*dest++ = *src++);
	return p;
}
int main()
{
	char arr1[20] = "aaaaaa";
	char arr2[] = "bbbbbbbb";
	my_strcat(arr1,arr2);
	printf("%s", arr1);
	return 0;
}

4.strcmp

代码如下(示例):

代码语言:javascript
复制
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
    //法一
	while (*str1)
	{
		while (*str1 != *str2)
		{
			return *str1 - *str2;
		}
		str1++;
		str2++;
	}
	return 0;
    //法二
    while (*str1 == *str2)
	{
		if (*str1=='\0')
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char arr1[] = "abddd";
	char arr2[] = "abc";
	int ret=my_strcmp(arr1,arr2);
	if (ret > 0)
		printf("str1大\n");
	else if (ret < 0)
		printf("str2大\n");
	else
		printf("一样大\n");
	return 0;
}

5.strncat

代码语言:javascript
复制
void my_strncat(char* dest, char* src, int n)
{
	while (*dest)
	{
		dest++;
	}
	while (n--)
	{
		*dest++= *src++;
	}
	*dest = '\0';
}
int main()
{
	char arr1[6] = "aa";
	char arr2[] = "bbbbb";
	my_strncat(arr1, arr2,3);
	printf("%s", arr1);
}

总结

在使用字符串函数的时候,要注意的是函数的返回值和参数的使用,以及源字符串和目的字符串的空间大小!

       我们下期再见!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一、函数介绍
    • 1.strlen
      • 2.注意事项:
    • 2.strcpy
      • 2.注意事项
    • 3.strcat
      • 2.注意事项
    • 4.strcmp
      • 比较规则
  • 长度受限的字符串函数
    • 5.strncpy
      • 6.strncat
        • 7.strncmp
        • 二、模拟实现
          • 1.strlen
            • 2.strcpy
              • 3.strcat
                • 4.strcmp
                  • 5.strncat
                  • 总结
                  相关产品与服务
                  对象存储
                  对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档