C语言关于自定义字符函数和字符串函数的相关笔试题(找工作必看)

本篇字符函数和字符串函数

求字符串长度 strlen

长度不受限制的字符串函数 strcpy strcat strcmp

长度受限制的字符串函数介绍 strncpy strncat strncmp

字符串查找 strstr strtok

错误信息报告 strerror

内存操作函数 memcpy memmove memset memcmp

在我们笔试时,很有可能会让我们自己写这样的库函数,所以我们必须明白这些函数的用法以及如何自己写出这样的函数。

文章目录

  • 本篇字符函数和字符串函数
  • 1.strlen函数及模拟实现
    • 1.1用法
    • 1.2模拟实现
  • 2.strcpy函数及模拟实现
    • 2.1用法
    • 2.2模拟实现
  • 3.strcat函数及模拟实现
    • 3.1用法
    • 3.2模拟实现
  • 4.strstr函数及模拟实现
    • 4.1用法
    • 4.2模拟实现
  • 5.strcmp函数及模拟实现
    • 5.1用法
    • 5.2模拟实现
  • 6.memcpy函数及模拟实现
    • 6.1用法
    • 6.2模拟实现
  • 7.memmove函数及模拟实现
    • 7.1用法
    • 7.2模拟实现
  • 8. 其他字符函数和字符串函数
    • 8.1strncpy
    • 8.2strncat
    • 8.3strncmp
    • 8.4字符分类函数
    • 8.5strock


1.strlen函数及模拟实现

1.1用法

字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包 含 ‘\0’ )。

用法举例:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{const char* str1 = "abcdef";int ret = strlen(str1);printf("%d", ret);return 0;
}

在这里插入图片描述
我们可以看到输出就是6,用来计算字符串中 ‘\0’ 前面出现的字符个数。

1.2模拟实现

//方法1,计数器方式
int my_strlen(const char * str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}//方法2,递归函数
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.strcpy函数及模拟实现

2.1用法

源字符串必须以 ‘\0’ 结束。其会将源字符串中的 ‘\0’ 拷贝到目标空间。

用法举例:

int main()
{char arr1[20] = {0};char arr2[] = "abc";strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

2.2模拟实现

char* my_strcpy(char* arr1,char* arr2)
{char* ret = arr1;assert(arr1 != NULL);assert(arr2 != NULL);while (*arr2!='\0'){*arr1 = *arr2;arr1++;arr2++;}return ret;
}

3.strcat函数及模拟实现

3.1用法

追加字符串,把一个字符串放到另一个字符串后面

用法举例:

int main()
{char arr1[30] = "shuaige,and,";char arr2[] = "meinv";printf("%s",strcat(arr1, arr2));return 0;
}

在这里插入图片描述

3.2模拟实现

char* my_strcat(char* arr1, char* arr2)
{char* ret = arr1;assert((arr1 && arr2) != NULL);while (*arr1 != '\0'){arr1++;}while (*arr2 != '\0'){*arr1 = *arr2;arr1++;arr2++;}return ret;
}

4.strstr函数及模拟实现

4.1用法

返回arr1中arr2第一次出现的位置,如果arr1中没有arr2,就返回NULL

用法举例:

int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";char* ret = strstr(arr1, arr2);if (ret == NULL){printf("找不到哦");}else{printf("%s", ret);}return 0;
}

在这里插入图片描述

4.2模拟实现

my_strstr(char* arr1, char* arr2)
{char* record;//记录开始匹配的位置char* s1;//变利arr1指向的字符串char* s2;//变利arr2指向的字符串assert((arr1 && arr2) != NULL);if (*arr2 == '\0')return arr1;record = arr1;while (*record != '\0'){s1 = record;s2 = arr2;while ((*s1 && *s2 && (*s1 == *s2)) != '\0'){s1++;s2++;}if (*s2 == '\0')return record;record++;}return NULL;
}

5.strcmp函数及模拟实现

5.1用法

比较两个字符串的大小(按位比较,也就是一位一位比较)
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字

用法举例:

int main()
{char arr1[] = "abc";char arr2[] = "abd";int ret = strcpy(arr1, arr2);if (ret>0)printf("arr1大");else if (ret=0)printf("一样大");else printf("arr2大");return 0;
}

在这里插入图片描述

5.2模拟实现

my_strcpy(char* arr1, char* arr2)
{assert((arr1 && arr2) != NULL);while (*arr1 == *arr2){if (*arr1 == '\0')return 0;arr1++;arr2++;}if (*arr1 > *arr2)return 1;elsereturn -1;
}

6.memcpy函数及模拟实现

6.1用法

拷贝数据,数据不重叠,即将一个数组拷贝到另一个不相干的数组。不能实现将一个数组拷贝到这个数组本身。

用法举例:

int main()
{int arr1[10] = { 0 };int arr2[] = { 1,2,3,4,5 };memcpy(arr1, arr2, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

在这里插入图片描述

6.2模拟实现

void* my_memcpy(void* arr1, void* arr2, int sz)
{void* ret = arr1;assert((arr1 && arr2) != NULL);while (sz != 0){*(char*) arr1 = *(char*) arr2;arr1 = (char*)arr1 + 1;arr2 = (char*)arr2 + 1;sz--;}return ret;
}

7.memmove函数及模拟实现

7.1用法

拷贝数据,数据重叠时也能做到。即相较于memcpy,可以实现将一个数组拷贝到这个数组本身。

用法举例:

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

在这里插入图片描述

7.2模拟实现

void* my_memmove(void* arr1, const void* arr2, size_t sz)
{assert((arr1 && arr2) != NULL);void* ret = arr1;if (arr1 < arr2){while (sz != 0){*(char*)arr1 = *(char*)arr2;arr1 = (char*)arr1 + 1;arr2 = (char*)arr2 + 1;sz--;}}else{while (sz!=0){sz--;*((char*)arr1 + sz) = *((char*)arr2 + sz);}}return ret;
}

8. 其他字符函数和字符串函数

提示:其他函数没有那么重要,这里只简单说明用法,不再进行模拟实现!

8.1strncpy

相较于strcpy,其可以自定义拷贝多少个字符。

int main()
{char arr1[20] = { 0 };char arr2[] = "abcdefghi";strncpy(arr1, arr2, 3);printf("%s\n", arr1);return 0;
}

在这里插入图片描述

8.2strncat

相较于strcat,可以自定义在后面拷贝多少个字符。

int main()
{char arr1[20] = "abc\0xxxxxxxxxxxxxx";char arr2[] = "defghi";strncat(arr1, arr2, 5);printf("%s\n", arr1);return 0;
}

在这里插入图片描述

8.3strncmp

相较于strcmp,可以指定比较多少个字符。

int main()
{char arr1[] = "abczef";char arr2[] = "abcqw";int ret = strncmp(arr1, arr2, 4);printf("%d\n", ret);return 0;
}

在这里插入图片描述

8.4字符分类函数

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isdigit十进制数字 0~9
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
islower小写字母a~z
isxdigit十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
isupper大写字母A~Z
isalpha字母a-z或A~Z
isalnum字母或者数字,a-z,A-Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

8.5strock

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

①sep参数是个字符串,定义了用作分隔符的字符集合
②第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
③strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
④strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
⑤strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
⑥strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。 如果字符串中不存在更多的标记,则返回 NULL 指针。

int main()
{char arr[] = "dashuaige@yeah.net@hehe.haha";char arr2[] = "192.168.23.101";char buf1[200] = { 0 };//"zpengwei\0yeah.net"strcpy(buf1, arr);char buf2[200] = { 0 };//"192.168.23.101"strcpy(buf2, arr2);char* p = "@.";char* s = NULL;for (s = strtok(buf1, p); s != NULL; s=strtok(NULL, p)){printf("%s\n", s);}char* p2 = ".";for (s = strtok(buf2, p2); s != NULL; s = strtok(NULL, p2)){printf("%s\n", s);}return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/84079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql限制用户登录失败次数,限制时间

mysql用户登录限制设置 mysql 需要进行用户登录次数限制,当使用密码登录超过 3 次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的 mysql: 8.1.0 这种方式不用重启数据库. 配置: 首先进入到 mysql 命令行:然后需要安装两个插件: 在 mysql 命令行中执行: mysql> INS…

易基因|ONT:三代原核甲基化在痤疮杆菌噬菌体表观遗传印迹中的工程选择性研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 痤疮表皮杆菌&#xff08;Cutibacterium acnes&#xff0c;C.acnes&#xff09;是一种革兰氏阳性细菌&#xff0c;是人类皮肤微生物组成员。尽管是最丰富的皮肤共生体&#xff0c;但某些…

详细介绍下VLAN隔离与VLAN之间互联

什么VLAN&#xff1f; VLAN代表虚拟局域网&#xff08;Virtual Local Area Network&#xff09;&#xff0c;它是一种在物理网络基础上创建逻辑上独立的虚拟网络的技术。VLAN允许将一个局域网划分为多个虚拟的逻辑网络&#xff0c;这些虚拟网络在逻辑上相互隔离&#xff0c;就…

支付宝开发问题:很抱歉,系统监测到你的支付宝账号有异常,入驻失败,如需帮助请拨打热线

想开发个支付宝小程序&#xff0c;结果困难重重啊 妹的&#xff0c;这一个星期一直都被这个问题困扰&#xff0c;找了一个个体户资质&#xff0c;一直失败&#xff0c;专门去注册了一个公司&#xff0c;还是提交失败。 给支付宝客服打电话&#xff0c;跟没打一样&#xff0c;…

外包干了2个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Windows系统如何部署Wing FTP Server与公网远程访问【内网穿透】

Wing FTP Server安装配置结合内网穿透实现公网访问本地站点 文章目录 Wing FTP Server安装配置结合内网穿透实现公网访问本地站点前言1.Wing FTP Server下载安装2.Wing FTP Server配置部署3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3…

使用 sklearn 进行数学建模的通用模板

前言 无论是本科和研究生都会有的数学建模含金量还是很高的&#xff0c;下面将介绍一下进行数学建模的一些基本操作方法&#xff0c;这里主要是利用sklearn 进行建模&#xff0c;包括前期的一些数据预处理以及一些常用的机器学习模型以及一些简单粗暴的通用建模步骤&#xff0…

在 Simscape Electrical 中对两区 MVDC 电动船的建模和仿真(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

springboot集成mybatis-plus

一、在spring boot中配置mybatis-plus 1、创建一个spring boot项目&#xff0c;注意勾选mysql 2、在pom.xml文件中添加mybatis-plus的依赖包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0&qu…

Llama-2 推理和微调的硬件要求总结:RTX 3080 就可以微调最小模型

大语言模型微调是指对已经预训练的大型语言模型&#xff08;例如Llama-2&#xff0c;Falcon等&#xff09;进行额外的训练&#xff0c;以使其适应特定任务或领域的需求。微调通常需要大量的计算资源&#xff0c;但是通过量化和Lora等方法&#xff0c;我们也可以在消费级的GPU上…

区块链技术:解密去中心化的革命

文章目录 区块链的基础概念什么是区块链&#xff1f;区块链的核心原理1. 分布式账本2. 区块3. 加密技术4. 共识机制 区块链的工作原理区块链的交易过程区块链的安全性共识机制的作用 区块链的应用领域1. 金融服务2. 供应链管理3. 物联网4. 医疗保健5. 政府与公共服务 区块链的未…

Fair下发产物-布局DSL生成原理

一、概述 大家都知道,Flutter在release环境是以AOT模式运行的,这就决定了我们要做动态化的话无法简单的通过动态下发dart代码执行的。根据Fair团队的前期调研,我们对布局动态化和逻辑动态化的实现采用了两套不同的实现方案,对于布局部分,我们在解析dart源文件之后生成DSL…

蓝桥杯 题库 简单 每日十题 day2

01 卡片 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有很多数字卡片&#xff0c;每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数&#xff0c;他想从 1 开始拼出正整数&#xff0c;每拼一个&a…

RK3568开发笔记(十一):开发版buildroot固件移植一个ffmpeg播放rtsp的播放器Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/133022813 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

LeetCode 25. K 个一组翻转链表

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 创建一个哨兵位头结点&#xff0c;然后将其链接在原来头结点的前边&#xff0c;以便于我们后面的便利使用。 每次翻转一小段之前首先判断一下接下里我们要翻转的这一小段的长度是否…

书剑宠物疫苗接种管理软件操作教程

【软件简介】 书剑宠物疫苗接种管理软件是一款宠物疫苗接种管理的工具&#xff0c;适合宠物诊所使用。具有动物主人建档、宠物疫苗接种登记管理、每日提醒、打印疫苗接种通知卡、自定义短信提醒模板等完善的功能。 另外本软件的特色是同时具有手机网页版功能&#xff0c;手机…

uni-app获取元素具体位置获取失败

场景&#xff1a;想要通过链接跳转传递catid&catid2类别id,商品类别id 跳到这一页左侧对应的类别栏上面,同时跳到右侧列表滚动到对应商品那一块区域。 遇到的问题&#xff1a;在for循环中通过绑定id获取不到商品列表的具体位置。 原因&#xff1a;在onReady函数和mounted函…

可视化图表组件之股票数据分析应用

股市是市场经济的必然产物&#xff0c;在一个国家的金融领域之中有着举足轻重的地位。在过去&#xff0c;人们对于市场走势的把握主要依赖于经验和直觉&#xff0c;往往容易受到主观因素的影响&#xff0c;导致决策上出现偏差。如今&#xff0c;通过数据可视化呈现&#xff0c;…

Puppeter与Electron的结合,使用Electron创建可视化界面

前言 上一篇文章&#xff1a;Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本&#xff0c;简单介绍了Puppeteer的基本使用&#xff0c;以及如何编写一个脚本。 但是呢脚本的运行需要在node环境里&#xff0c;开发人员可能没什么问题。但是如果你写的这个脚本要给…

Selenium 4.11 正式发布--再也不用手动更新chrome driver 了

Selenium 4.11.0 正式发布了&#xff0c;先来看一下主要特性。 Chrome DevTools支持的版本现在是&#xff1a;v113、v114和v115&#xff08;Firefox仍然对所有版本使用v85&#xff09; 通过Selenium Manager支持Chrome For Testing&#xff08;CfT&#xff09; Selenium Manag…