c语言学习笔记之字符串库函数和逗号表达式

逗号表达式

#include <stdio.h>
 
int main(){
    int a = 10;
    int b =5;
    int c = 6;
    int d = (a = 2+3,b = a-4,c= b+2);
    printf("%d",d);
}

打印结果为:
在这里插入图片描述
逗号表达式,从左往右依次进行,将最后一个表达式的值赋值给变量.

c语言字符串相关库函数

求字符串长度strlen
长度不受限制的字符串函数strcpy , strcat , strcmp
长度受限制的字符串函数strncpy , strncat , strncmp
字符串查找strstr , strtok
错误信息报告strerror
内存操作函数memcpy , memmove , memset , memcmp

下面分别进行详细介绍

strlen <----求字符串长度

所需头文件

#include <string.h>

参数类型

size_t strlen(const char* string);

参数类型为char*,因此我们传进来的参数需要是字符串的地址,并且这里的指针变量用const修饰,可以保证传进来的字符串不被修改. 因为我们求字符串的长度是不需要对字符串进行修改的,加上const保证程序的安全. size_t是函数的返回值类型,他是一个无符号整型. 关于这个无符号整形,会导致一些问题,可以用一个例子说明.

#include <stdio.h>
#include <string.h>
int main()
{
	char* str1 = "abc";
	char* str2 = "abcedf";
	if (strlen(str1) - strlen(str2) > 0)
	{
		printf("str1 is bigger\n");
	}
	else
	{
		printf("str2 is bigger\n");
	}
	return 0;
}

我们可以看出,str1比str2短,因此结果应该为负数,小于0,打印str2 is bigger. 但是运行程序,发现结果如下:
在这里插入图片描述
这和我们所认为的不同,就是因为strlen函数返回的是一个无符号整型,因此当两个无符号整型进行减法的时候,得到的结果仍然是无符号整型,因此虽然得到的结果为负数,但是在无符号整型看来,这是一个很大的正数,前面的符号位被认为是一个有效的数字位,导致结果大于0.打印的是str1 is bigger. 如果想要进行比较长度大小,可以直接strlen(str1) > strlen(str2)这样子比较就没有问题了.

注意事项

  1. strlen函数返回的是在字符串中 \0 前面出现的字符个数(不包含 ‘\0’ ),因此当字符串中存在\0的时候,得到的不是字符串的长度
  2. 参数指向的字符串必须要以 ‘\0’ 结束,否则strlen会运行到读取到\0才结束
  3. 注意函数的返回值为size_t,是无符号的,在计算的时候要注意

strcpy<----字符串拷贝

所需头文件

#include <string.h>

参数类型

char *strcpy(char *strDestination,const char* strSource);

参数类型是两个字符串指针地址,第一个是需要被拷贝的字符串地址,第二个参数是要拷贝的内容. 其中要拷贝的内容由于不需要改变,用const修饰,保证程序的安全. 函数的返回值类型为char*类型,是拷贝完成后的字符串地址.

注意事项

  1. strSource必须以\0结束,否则strcpy函数不知道什么时候拷贝结束
  2. 拷贝会将\0也拷贝到strDestination中
  3. strDestination必须足够大,确保放的下strSource,防止越界访问
  4. strDestination不能被const修饰,必须是可变的.

strcat<—字符串追加

所需头文件

#include <string.h>

参数类型

char *strcat(char *strDestination,const char* strSource);

参数类型和strcpy是一致的,就不再赘述了. 返回值类型也是char*类型.用来返回被追加后的字符串地址.

具体功能是将两个字符串拼接起来.

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "efgh";
	char* ret = strcat(str1, str2);
	printf("%s", ret);
	return 0;
}

运行结果如下:
在这里插入图片描述

strcat的注意事项和strcpy类似,唯一的区别在于strDestination的空间要足够大,能够放得下strSource+原strDestination才行.而strcpy只需要能够放得下strSource就行.

strcmp<—字符串比较

所需头文件

#include <string.h>

参数类型

int strcmp(const char *string1,const char* string2);

参数为两个字符串指针,都被const修饰,不需要对字符串进行修改,只是进行比较,保证程序的安全性. 返回值类型为int类型.
strcmp函数对返回值的规定如下:

  • 标准规定
    • 第一个字符串大于第二个字符串,返回大于0的数字
    • 第一个字符串等于第二个字符串,返回0
    • 第一个字符串小于第二个字符串,返回小于0的数字

strcmp函数的功能就是比较两个字符串的大小,比较的是字符串的内容而不是字符串的长度.
比方说abcde就小于accd因为从第二个字符开始,b的ASCII码小于c的ASCII码. 但字符串的长度确实abcde大于accd

strncpy<—受限制的字符串拷贝

所需头文件

#include <string.h>

参数类型

char *strncpy( char *strDestination,const char *strSource,size_t count);

前两个参数类型和strcpy是一致的,只是多了个size_t类型的参数count用来控制拷贝字符的个数. 这里的count为多少,就从strSource中拷贝多少个字符到strDestination中. 返回值类型也和strcpy一样,返回的是被拷贝的字符串的地址

strncpy的功能如下:

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "kpl";
	char* ret = strncpy(str1, str2, 2);
	printf("%s", ret);
	return 0;
}

运行结果如下:
在这里插入图片描述
作用就是经str2的前面两个字符串拷贝到str1的前面两位.因此结果为kpcd
注意事项和strcpy是一致的.

strncat<—长度受限制的字符串追加

所需头文件

#include <string.h>

参数类型

char *strncat(char *strDestination,const char* strSource, size_t count);

和strncpy类似,也是多了个size_t类型的count用来控制追加字符串的长度.返回的也是被追加字符串的地址.

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[20] = "abcd";
	char str2[] = "efgh";
	char* ret = strncat(str1, str2, 2);
	printf("%s", ret);
	return 0;
}

运行结果为:
在这里插入图片描述
将str2中的前面两个字符追加到str1中,因此结果为abcdef
注意事项和strncat一致.

strncmp<----长度受限制的字符串拷贝

所需头文件

#include <string.h>

参数类型

int strncmp(const char *string1,const char* string2, size_t count);

类似的,多了个size-t类型的count,用来控制比较字符串的长度. 返回的值和strcmp一样.

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcd";
	char str2[] = "abkl";
	int ret = strncmp(str1, str2, 2);
	printf("%d", ret);
	return 0;
}

运行结果为:
在这里插入图片描述
由于str1和str2前面两个字符都为ab,因此比较的结果是两者相等,因此结果为0
如果使用strcmp比较,结果为小于0的数字.

strstr<----字符串查找函数

所需头文件

#include <string.h>

参数类型

char *strstr(const char *string,const char* strCharSet);

参数是两个指针,分别接收的是被查找的字符串地址和查找内容的字符串地址,两个指针都被const修饰. 返回值类型为char*,所以接收的是字符string被strcharset查找到后,对应查找到的字符串的首地址.

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[] = "abcdefdgh";
	char str2[] = "d";
	char* ret = strstr(str1, str2);
	printf("%s", ret);
	return 0;
}

运行结果为:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】线程安全

线程安全 一、Linux线程互斥1、进程线程间的互斥相关背景概念&#xff08;1&#xff09;临界区和临界资源&#xff08;2&#xff09;互斥和原子性出现负数原因为什么--ticket不是一个原子操作&#xff1f; 2、互斥量mutex&#xff08;1&#xff09;互斥量的接口i、初始化互斥量…

[嵌入式软件][入门篇][仿真平台] STM32CubeMX的搭建

文章目录 一、简介二、STM32CubeMX的使用(1) 新建文件&#xff0c;芯片选型(2) sys设置和RCC设置(3) 配置时钟(4) 生成代码 三、仿真平台的使用 一、简介 STM32CubeMX是一种图形工具&#xff0c;通过分步过程可以非常轻松地配置STM32微控制器和微处理器&#xff0c;生成相应的初…

Java项目:基于SSM框架实现的医疗企业管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm815基于SSM框架实现的医疗企业管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

【wvp】关于码率等的相关流程设计

目录 流程设计 前端UI大致设计 终端上的相关修改界面参考 流程设计 前端UI大致设计 终端上的相关修改界面参考

Apache SeaTunnel (不含web) Window11 本机搭建(非源码)

启动环境 需要提前准备的(只提供作者试过且可行的方案) window11ubuntu20(wsl2) window11内置ubuntu的方式自行百度&#xff0c;此处不做陈述jdk8mysql8navicatvscode 环境准备不做过多陈述&#xff0c;以下是正式的安装启动步骤 SeaTunnel 2.3.3 资源准备 第一步: 创建文件…

java8 Duration类学习

Duration类 官网地址 基于时间的时间量&#xff0c;例如“34.5秒”。 此类以秒和纳秒为单位对时间的量或量进行建模。它可以使用其他基于持续时间的单位访问&#xff0c;如分钟和小时。此外&#xff0c;可以使用DAYS单位&#xff0c;并将其视为完全等于24小时&#xff0c;从…

5-1 A. DS串应用--KMP算法

题目描述 学习KMP算法&#xff0c;给出主串和模式串&#xff0c;求模式串在主串的位置 算法框架如下&#xff0c;仅供参考 输入 第一个输入t&#xff0c;表示有t个实例 第二行输入第1个实例的主串&#xff0c;第三行输入第1个实例的模式串 以此类推 输入样例&#xff1a; 3 qwe…

2024-01-29 ubuntu 用脚本设置安装交叉编译工具链路径方法,设置PATH环境变量

一、设置PATH环境变量的方法,建议用~/.bash_profile的方法&#xff0c;不然在ssh登录的时候可能没有设置PATH. 二、下面的完整的脚本&#xff0c;里面的echo "export PATH$build_toolchain_path:\$PATH" >> $HOME/.bashrc 就是把交叉编译路径写写到.bashrc设置…

回文子字符串的个数

判断一个字符串是否是一个回文除了从两端向里移动指针&#xff0c;也可以采用指针从字符串中心开始向两端延伸。即如果存在一个长度为m的回文子字符串&#xff0c;再分别向该回文两端延伸一个字符&#xff0c;并判断这两个字符是否相同&#xff0c;如果相同则找到了一个长度为m…

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

Vue3下载WEBAPI导出的Excel文件

webApi查询数据保存为Excel /// <summary>/// 获取LMI3D相机涂胶测量数据/// </summary>/// <returns></returns>[HttpPost(Name "GetLMI3DGlueDataToExcel")]public async Task<IActionResult> GetLMI3DGlueDataToExcel(QueryGlueM…

500道微信小程序毕业设计题目,小程序新颖毕业选题推荐,建议收藏

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

CSRF靶场练习

简述&#xff1a;CSRF漏洞实际很少&#xff1b;条件限制很多&#xff1b;局限性很大&#xff1b;实验仅供参考&#xff0c;熟悉csrf概念和攻击原理即可 Pikachu靶场 CSRF GET 登录用户vince的账户可以看到用户的相关信息&#xff1b; 点击修改个人信息&#xff0c;发现数据包…

PawSQL更新 | 新增18个SQL性能审核重写规则

PawSQL最新版本针对DML和DQL新增了审核和重写优化规则共计33个&#xff0c;整体的规则数目达到了83个&#xff0c;覆盖了正确性&#xff0c;安全性、可维护性、性能四个方面的SQL质量问题&#xff0c;并提供了优化建议&#xff0c;已经形成比较完善的针对数据操作的SQL质量审查…

Vertica单点更改服务器ip

需求 服务器网段调整&#xff0c;将ip&#xff1a;192.168.40.190收回&#xff0c;使用ip&#xff1a;192.168.40.200 默认情况下&#xff0c;节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

CodeFuse新开源模型荣登Big Code评测榜首!

使用多任务高效微调框架MFTCoder&#xff0c;以DeepSeek-Coder-33b模型为底座&#xff0c;微调获得的CodeFuse-DeepSeek-33b模型在Big Code Models Leaderboard代码大模型榜单上以43.58% WinRate成为新晋榜首&#xff0c;同时模型在NLP任务上也取得了很好的表现。本文我们将介绍…

【C++】类与对象(二)特殊成员函数

前言 类与对象&#xff08;二&#xff09; 文章目录 一、特殊成员函数二、构造函数三、析构函数四、拷贝构造函数五、拷贝赋值运算符 一、特殊成员函数 如果在类的声明中未显式提供某个成员函数的定义&#xff0c;编译器会自动生成一个默认实现。 这包括默认构造函数、默认析构…

怎么制作出圈的虚拟数字人城市宣传短片?

如今&#xff0c;中国城市面临一个从To B&#xff08;企业客户&#xff09;、To G&#xff08;政府客户&#xff09;到To C&#xff08;一般客户&#xff09;的转变。其中&#xff0c;城市宣传片作为与C端沟通的最佳途径&#xff0c;一个“吸睛”的城市短片&#xff0c;可以有效…

揭秘支付宝小程序开发:从零到一,轻松掌握开发流程!

目录 1、介绍支付宝小程序开发 1.1 什么是支付宝小程序 1.2 支付宝小程序与其他小程序的区别 1.3 支付宝小程序的优势 2、准备工作 2.1 注册支付宝小程序开发者账号 2.2 下载支付宝小程序开发工具 2.3 了解支付宝小程序的基本概念和架构 3、开发环境搭建 3.1 安装并配…

如何在 Ubuntu 中安装 Microsoft Edge 浏览器

微软终于聪明了一回&#xff0c;也学会了「打不过就加入」。Microsoft Edge 浏览器的 Linux 稳定版已经于 2020 年 10 月 23 日发布&#xff0c;并提供给 Linux 发行版使用。除了官方 Edge APT 源以外&#xff0c;还提供了.deb和.rpm格式的安装包。 Microsoft Edge 基于 Chrom…