【c语言】字符函数与字符串函数(上)

news2024/10/5 17:27:09

大家好呀,今天给大家分享一下字符函数和字符串函数,说起字符函数和字符串函数大家会想到哪些呢??我想到的只有求字符串长度的strlen,拷贝字符串的strcpy,字符串比较相同的strcmp,今天,我要分享给大家的是我们一些其他的字符函数和字符串函数,跟着小张一起去看看吧!

文章目录

  • 前言
  • 长度不受限制的字符串函数
    • strcat
  • 长度受限制的字符串函数
    • strncpy
    • strncat
    • strncmp
  • 字符串查找
    • strstr
    • strtok
  • 错误信息报告
    • strerror
  • 模拟实现
    • strcat的模拟实现
    • strstr的模拟实现
  • 总结

前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串中或者字符数组 中.字符串常量 适用于那些对它不做修改的字符串函数


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

strcat

功能:可以在一个字符串后面追加字符
函数声明:char *strcat( char *strDestination, const char *strSource );
头文件:string.h
参数解释以及返回值解释:第一个参数接收被追加字符串数组的地址,第二个参数是追加的内容字符串数组,返回的是追加后字符串数组的地址
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "gh";
	strcat(arr1, arr2);
	printf("%s", arr1);


}

注意:源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。

int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = {'a','b','c'};
	strcat(arr1, arr2);
	printf("%s", arr1);
}

在这里插入图片描述
程序发生崩溃,arr2数组如果没有’\0’的话,他会在后面地址上找到\0,在追加到arr1数组的时候,会越界放不下

字符串strcat函数不能自己给自己追加

追加前在这里插入图片描述
追加后
在这里插入图片描述
追加的时候把源数组中的‘\0’被追加字符所覆盖


长度受限制的字符串函数

strncpy

功能:拷贝num个字符从源字符串到目标空间
函数声明:char * strncpy ( char * destination, const char * source, size_t num );
头文件:string.h
参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是拷贝字符的数目

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[40] = "hered ";
	char arr2[] = "ll";
	strncpy(arr1,arr2,2);
	printf("%s",arr1);
}

在这里插入图片描述

如果源字符小于要拷贝的个数会怎么样??

int main()
{
	char arr1[40] = "hered+++++++++ ";
	char arr2[] = "ll";
	strncpy(arr1, arr2, 10);
	printf("%s", arr1);
}

在这里插入图片描述
在这里插入图片描述

注意:拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。


strncat

功能:追加num个字符从源字符串到目标空间。
声明:char * strncat ( char * destination, const char * source, size_t num );
头文件:string.h
参数:第一个参数为接收目标空间地址,第二个参数接收是源空间地址,返回参数是目标地址,size_t是无符号整数类型,num是追加字符的数目

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[40] = "hello ";
	char arr2[13] = "shuxiansheng";
	strncat(arr1, arr2, 3);
	printf("%s",arr1);
}

在这里插入图片描述

strncat可以追加自己

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[40] = "hello ";
	char arr2[13] = "shuxiansheng";
	strncat(arr1, arr1, 5);
	printf("%s",arr1);
}

在这里插入图片描述


strncmp

功能:可以比较指定个数的字符串比较
声明:int strncmp ( const char * str1, const char * str2, size_t num );
头文件:string.h
参数:第一个参数接收第一个字符串地址,第二个参数接收第二个字符串地址,第三个参数为比较字符的个数,比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[6] = "hello";
	char arr2[] = "helld";
	int ret=strncmp(arr1, arr2, 4);
	printf("%d", ret);
}

在这里插入图片描述

比较前四个字符,由于前四个字符相同,返回0,比较五个字符,o的ascll码值大于d的ascll码值返回1;


字符串查找

strstr

功能:查找子串
声明: char * strstr ( char * str1, const char * str2 );
头文件string.h
参数:第一个参数接收被查找的字符串的首地址,第二个参数疑似子串的字符串的首地址
如果是子串的话,返回字符串中子串的首地址,不是子串的话返回空指针在这里插入图片描述

代码

int main()
{
	char arr1[] = "abcdefg";
	char arr2[] = "fg";
	char *p=strstr(arr1,arr2);//保存返回子串的首地址
	if (p)
	{
		printf("是子串:%s", p);
	}
	else
	{
		printf("不是子串");
	}

}

编译运行

在这里插入图片描述
在这里插入图片描述


strtok

功能:分隔子串
声明:char * strtok ( char * str, const char * sep );
头文件:string.h
参数:第一个参数接收被分解字符串的地址,第二个参数中接收的是字符串中分隔符的地址,返回被分隔子串的首地址

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello@qq.com";
	char arr2[] = "@.";
   strtok(arr1, arr2);
   printf("%s", arr1);
}

编译运行
在这里插入图片描述

第一个参数指定一个字符串,它包含了0个或者多个由arr2字符串中一个或者多个分隔符分割的标记。
strtok函数找到arr1中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。
strtok函数的第一个参数不为 NULL ,函数将找到arr1中第一个标记,strtok函数将保存它在字符串中的位置(strtok函数在内部维护了一个静态变量保存这个位置)。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针

代码展示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello@qq.com";
	char arr2[] = "@.";
	printf("%s\n", strtok(arr1, arr2));

   printf("%s\n", strtok(NULL, arr2));

	printf("%s\n", strtok(NULL, arr2));
   
}

编译运行
在这里插入图片描述

修改:我们可以将字符串arr1传给strtok函数,第一个@分隔符。strtok函数返回字符串中第一个遇到分隔符之前的字符串首地址,”hello’',然后在循环中继续调用strtok函数,第一个参数传NULL,strtok自己维护的静态变量,记住上次分隔的地方,不用在传arr1.

代码实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
	char arr1[20] = "hello@qq.com";
	char arr2[] = "@.";
	char* p =NULL;
	for (p = strtok(arr1, arr2); p != NULL; p = strtok(NULL, arr2))
	{
		printf("%s\n",p);
	}


}

编译运行
在这里插入图片描述


错误信息报告

strerror

功能:可以返回指向错误信息字符串地址
声明:char *strerror( int errnum );
头文件:string.h errno.h
参数:errnum是错误码,就像404页面,每个错误码对应着错误信息,返回值是指向错误信息字符串地址

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));


}

在这里插入图片描述

当我们向内存申请空间时,我们会使用malloc函数,如果申请的内存太大,是否会报错呢??它会将错误码放在整型全局变量errno中,使用errno时引用头文件errno.h

代码展示:

`#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	  int *p=malloc(4000000000);//malloc申请内存失败会返回空地址
	  if (p == NULL)
	  {
		  printf("%s\n", strerror(errno));
	  }

}`

在这里插入图片描述

注意:遇到多个错误时,errno会不断赋新的错误码


模拟实现

strcat的模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* mystrcat(char* p, char* q)
{
	assert(p && q);
	char* k = &p;//随着p++,会丢失目标字符串首地址先保存
	while (*p)
	{
		p++;
	}//将p指针移动到目标字符串'\0'位置
	while ((*p++=*q++))//将*q的值先给*p,然后两个q++;p++;赋值后的ascll值不为0,继续循环,当*q=='\0',赋值后ascll码值为'\0',退出循环
	{
	}
	return k;//返回目标字符串首地址
}
int main()
{
	char arr1[20] = "abcde";
	char arr2[5] = "qqq";
	mystrcat(arr1, arr2);
	printf("%s", arr1);

}

在这里插入图片描述


strstr的模拟实现

char* mystrstr(char* str1, char* str2)
{
	char* s1 = str1;//两个遍历指针分别指向两个字符串的首地址
	char* s2 = str2;
	char* cur = s1;//两个字符串开始匹配的指针
	while (*cur)//每循环一次,就是重新匹配的过程
	{
		s1 = cur;//s1移动到下一个开始匹配的位置
		s2 = str2;//子串要从头开始匹配
		while (*s1&&*s2&&(*s1 == *s2))//匹配的循环
		{
			s1++;
			s2++;
        }
		                            //不匹配退出循环
		if (*s2 == '\0')//当匹配循环完,s2的指针指向子串的末尾'\0';
		{
			return cur;//保存的是匹配成功时,字符串中匹配到的第一个字符首地址
		}
		cur++;                       //此时cur指向的位置不能作为开始匹配的位置,cur++;开始新一轮的匹配

    }
	return NULL;//当cur遍历完字符串,则说明没有该子串
}
int main()
{
	char arr1[] = "abcdecdfg";
	char arr2[] = "cdf";
	char *p=mystrstr(arr1,arr2);//如果找到子串返回字符串中和子串匹配的首字符首地址不为空
	if (p)
	{
		printf("是子串");
	}
	else
	{
		printf("不是子串");
	}

}

编译运行
在这里插入图片描述
在这里插入图片描述


总结

字符串函数,字符函数在处理字符问题特别的方便,使得问题简单化,本章还未讲到的内存操作函数放在下一篇讲,如果你觉得这篇文章对你有帮助的话,别忘了给小张点赞,收藏加关注,哪里不对的话还望大佬们指教,谢谢大家!!我会持续分享给大家自己学到的知识,也是在好好的做总结

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

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

相关文章

② vue模板语法

文本绑定 普通文本渲染{{ }} 静态的文本绑定 v-html 动态的文本绑定 b-bind&#xff08;:&#xff09; 动态的属性绑定&#xff0c;可简写&#xff08;比如&#xff1a;v-bind:id :id&#xff09; 列表渲染 v-for 要有一个唯一id :key"item.id"(没有id就…

for macOS-21.1.0.3267中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是&#xff1a;Fruity Loops Studio编曲&#xff0c;由于其Logo长的比较像一款水果因此&#xff0c;在大家更多的是喜欢称他为水果萝卜&#xff0c;FL studio21是目前最新的版本&#xff0c;这是一款可以让你的计算机就像是一个全功能的录音室&…

GPT-NER:使用大型语言模型进行命名实体识别

讲在前面&#xff0c;chatgpt出来的时候就想过将其利用在信息抽取方面&#xff0c;后续也发现了不少基于这种大语言模型的信息抽取的论文&#xff0c;比如之前收集过的&#xff1a; https://github.com/cocacola-lab/GPT4IE https://github.com/RidongHan/Evaluation-of-ChatG…

p5.js 渐变填充的实现方式

theme: smartblue 本文简介 p5.js 作为一款艺术类的 canvas 库&#xff0c;对颜色方面的支持是挺下功夫的&#xff0c;比如本文要介绍的渐变方法。 lerpColor() 要实现渐变效果&#xff0c;可以使用 lerpColor() 方法。 lerpColor 的作用是混合两个颜色以找到一个介于它们之间的…

QGraphicsView实现简易地图5『经纬网格』

前文链接&#xff1a;QGraphicsView实现简易地图4『局部加载-地图漫游』 由于GCJ02 Web 墨卡托投影 纬度并不随像素等分&#xff0c;且两极跨度较大&#xff0c;因此本次演示采用的经纬网等分逻辑为等分像素。同等像素跨度之间&#xff0c;两级纬度变化较小&#xff0c;越靠近赤…

项目介绍:《WeTalk》网页聊天室 — Spring Boot、MyBatis、MySQL和WebSocket的奇妙融合

目录 引言&#xff1a; 前言&#xff1a; 技术栈&#xff1a; 主要功能&#xff1a; 功能详解&#xff1a; 1. 用户注册与登录&#xff1a; 2. 添加好友 3. 实时聊天 4. 消息未读 5. 删除聊天记录 6. 删除好友 未来展望&#xff1a; 项目地址&#xff1a; 结语&am…

IDEA关闭项目,但是后台程序没有关闭进程(解决方案)

最近遇到一个很奇怪的问题&#xff0c;idea关闭项目后&#xff0c;系统进程没有杀死进程&#xff0c;再次执行的时候会提示端口占用&#xff0c;并提示Process exited with an error: 1 (Exit value: 1) 错误原因&#xff1a;应用程序关闭后&#xff0c;进程不能同步关闭 解决方…

Python 使用Hadoop 3 之HDFS 总结

Hadoop 概述 Hadoop 是一个由Apache 软件基金会开发的分布式基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序&#xff0c;充分利用集群的威力进行高速运算和存储。 Hadoop 实现一个分布式文件系统&#xff08;Hadoop Distributed File Sy…

短肥网络的 RTT 敏感性

周二下班路上发了一则朋友圈&#xff1a; 长肥管道的特征和问题谈得够多了&#xff0c;但这里谈的是短肥管道&#xff0c;因为下面趋势&#xff0c;短肥管道才是未来大势&#xff1a; 云计算致使数据中心网络快速发展&#xff0c;而数据中心网络时延短&#xff0c;带宽大。CD…

尼科彻斯定理-C语言/Java

描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 例如&#xff1a; 1^31 2^335 3^37911 4^313151719 输入一个正整数m&#xff08;m≤100&#xff09;&#xff0c;将m的立方写成m个连续奇数之和的形式输出。&…

代码详解——Transformer

文章目录 整体架构Modules.pyScaledDotProductAttention SubLayers.pyMultiHeadAttentionPositionwiseFeedForward Layers.pyEncoderLayerDecoderLayer Models.pyget_pad_maskget_subsequent_maskPositionalEncodingEncoderDecoderTransformer 整体架构 源码地址&#xff08;py…

传输控制协议TCP

目录 TCP报文格式 TCP的特点 TCP原理: 1.确认应答机制 2.超时重传机制 3.连接管理机制 建立连接 ​编辑关闭连接 4.滑动窗口机制 ​5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答 TCP报文格式 1.源端口号:发送端的哪一个端口发出的 2.目的端口号:接收端的哪一个端…

【深度学习】遗传算法[选择、交叉、变异、初始化种群、迭代优化、几何规划排序选择、线性交叉、非均匀变异]

目录 一、遗传算法二、遗传算法概述2.1 选择2.2 交叉2.3 变异 三、遗传算法的基本步骤3.1 编码3.2 初始群体的生成3.3 适应度评估3.4 选择3.5 交叉3.6 变异3.7 总结 四、遗传算法工具箱4.1 initializega4.2 ga4.3 normGeomSelect4.4 arithXover4.5 nonUnifMutation 五、遗传算法…

【Transformer】自注意力机制Self-Attention | 各种网络归一化Normalization

1. Transformer 由来 & 特点 1.1 从NLP领域内诞生 "Transformer"是一种深度学习模型&#xff0c;首次在"Attention is All You Need"这篇论文中被提出&#xff0c;已经成为自然语言处理&#xff08;NLP&#xff09;领域的重要基石。这是因为Transfor…

苹果电脑 Java切换版本

效果 1、安装 Java1.8和Java11 直接官网下载并安装 2、安装后的文件 /资源库/Java/JavaVirtualMachines/ 3、修改配置文件 vi ~/.bash_profile#java export JAVA_8_HOME"/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home" alias jdk8expor…

大语言模型(LLM)与 Jupyter 连接起来了

现在&#xff0c;大语言模型&#xff08;LLM&#xff09;与 Jupyter 连接起来了&#xff01; 这主要归功于一个名叫 Jupyter AI 的项目&#xff0c;它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源&#xff0c;其连接的模型主要来自 AI21、Anthropic、AWS、Co…

信号调制原理演示,模拟和数字调制技术大比拼

【中英双语字幕】信号调制原理演示&#xff0c;模拟和数字调制技术大比拼&#xff01;_哔哩哔哩_bilibili

Filament for Android 编译搭建(基于Ubuntu20.04系统)

一、Filament 源代码下载 github下载地址&#xff1a; 2、安装clang 我是直接安装clang-10 Ubuntu 20.04 &#xff0c;sudo apt install clang 命令默认就是clang-10 $sudo apt-get install clang-10 # 安装 AST.h 等头文件 $sudo apt-get install libclang-10-dev $sudo …

大语言模型:LLM的概念是个啥?

一、说明 大语言模型&#xff08;维基&#xff1a;LLM- large language model&#xff09;是以大尺寸为特征的语言模型。它们的规模是由人工智能加速器实现的&#xff0c;人工智能加速器能够处理大量文本数据&#xff0c;这些数据大部分是从互联网上抓取的。 [1]所构建的人工神…

期权定价模型系列【3】—Delta动态对冲

Delta动态对冲 本文章主要介绍常见的delta对冲概念&#xff0c;具体的delta动态对冲代码可以参考【期权量化】专栏同名文章 专栏地址&#xff1a; http://t.csdn.cn/obNflhttp://t.csdn.cn/obNfl 1.前言 期权交易有四种基本交易方式&#xff1a;买入看涨期权、卖出看涨期权、买…