C 标准库 string常用函数 笔记

2023-05-16

文章目录

    • @[TOC](文章目录)
  • 前言
  • 字符串长度
    • strlen()
    • sizeof
  • 字符串拼接
    • strcat()
    • strncat()
  • 字符串拷贝
    • strcpy()
    • strncpy()
    • memcpy()
  • 内存填充
    • memset()
  • 字符串比较
    • strcmp()
    • strncmp()
  • 字符串查找
    • strchr()
    • strrchr()
    • strstr()
  • 字符串与数字互转
    • atoi()、 atol()
    • strtol()
    • strtoul
  • 字符串转浮点型数据
    • atof()
    • strtod() strtof()

前言

C 标准库 string.h 常用函数梳理


字符串长度

strlen()

计算字符串长度的函数 strlen()

#include <string.h>
size_t strlen(const char *s);

s: 需要计算的字符串,字符串必须包含结束字符’ \0 '。
return:返回字符串长度(以字节为单位)

例如:

char str[] = "1234567890abcde";
printf("Length: %ld\n", strlen(str));

结果为 Length: 15

sizeof

统计数据类型所占用的内存大小

sizeof 和 strlen 的区别

sizeof 用来计算数据类型或变量大小,strlen 只能以结尾为’ \0 '的字符串作为参数

char str[20] = "1234567890abcde";
printf("sizeof: %ld\n", sizeof(str));
printf("strlen: %ld\n", strlen(str))

结果为sizeof: 20 strlen:15

字符串拼接

strcat()strncat()用于将两个字符串连接起来,strncat 可以指定源字符串追加到目标字符串的字符数量

strcat()

#include <string.h>
char *strcat(char *dest, const char *src);

dest: 目标字符串。
src: 源字符串。
return: 返回指向目标字符串 dest 的指针。

strcat()函数会把 src 字符串追加到 dest 字符串的末尾,所以必须要保证 dest 有足够的存储空间来容纳两个字符串,否则会导致溢出错误

strncat()

strncat 可以指定源字符串追加到目标字符串的字符数量

#include <string.h>
char *strncat(char *dest, const char *src, size_t n);

dest: 目标字符串。
src: 源字符串。
n: 要追加的最大字符数。
return: 返回指向目标字符串 dest 的指针。

注意实际追到到dest字符串的数量为n+1(结束字符’ \0 ')

char str1[100] = "Linux app strcat test, ";
char str2[] = "Hello World!";
strncat(str1, str2, 5);
puts(str1);

结果为 : Linux app strcat test,Hello

字符串拷贝

拷贝函数会将目标字符串覆盖

strcpy()函数和 strncpy()函数用于实现字符串拷贝,strncpy()可以指定复制到目标的字符数量

strcpy()

#include <string.h>
char *strcpy(char *dest, const char *src);

dest: 目标字符串。
src: 源字符串。
return: 返回指向目标字符串 dest 的指针。

strcpy()会把 src 指向的字符串复制 到 dest中,必须保证 dest 指向的内存空间足够大,否则会导致溢出错误

char str1[100] = "123456789";
char str2[] = "Hello World!";
strcpy(str1, str2);
puts(str1); //Hello World!

结果 Hello World!

strncpy()

strncpy()可以指定从源字符串 src 复制到目标字符串 dest 的字符数量

#include <string.h>
char *strncpy(char *dest, const char *src, size_t n);

dest: 目标字符串。
src: 源字符串。
n: 从 src 中复制的最大字符数。
return: 返回指向目标字符串 dest 的指针。

char str1[100] = "12345678910";
char str2[] = "Hello World!";
strncpy(str1, str2, 5);
puts(str1);	//Hello678910

memcpy()

可以从 str2 复制 n 个字节到str1

#include <string.h>
void *memcpy(void *str1, const void *str2, size_t n)

str1: 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
str2:指向要复制的数据源,类型强制转换为 void* 指针。
n:要被复制的字节数

注意:n为字节数并非个数
例如:

	int data[50] = { 1,2,3,4,5 };
	int str[20] = {10,11,12,13,14,15 };
	memcpy(data + 6, str, 4);
	for (int i = 0; i < 15; i++)
		printf("%d ", data[i]);

实际输出为:1 2 3 4 5 0 10 0 0 0
int变量为4个字节,所以只复制了一个数据到data数组中,如需要全部复制使用sizeof()

char str1[100];
char str2[]="ABCD";
memcpy(str1,str2,sizeof(str2));
printf("%s",str1);  //ABCD

内存填充

memset()

memset()函数用于将某一块内存的数据全部设置为指定的值,但它是以字节为单位进行初始化的。

#include <string.h>
void *memset(void *s, int c, size_t n);

s: 需要进行数据填充的内存空间起始地址。
c: 要被设置的值,该值以 int 类型传递。
n: 填充的字节数。
return: 返回指向内存空间 s 的指针。

char str[100];
memset(str, 0x0, sizeof(str));

对数组 str 进行初始化操作,将全部设置为 0

字符串比较

比较函数有:strcmp()strncmp()strcmp()

strcmp()

#include <string.h>
int strcmp(const char *s1, const char *s2);

s1: 进行比较的字符串 1。
s2: 进行比较的字符串 2。
return:
小于 0, str1 小于 str2
大于 0, str1 大于 str2
等于 0, str1 等于 str2

printf("%d\n", strcmp("ABC", "ABC"));	//0
printf("%d\n", strcmp("ABC", "a"));		//-1
printf("%d\n", strcmp("a", "ABC"));		//1

strncmp()

strcmp()一样,区别在于比较前 n 个字符

#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);

s1: 参与比较的第一个字符串。
s2: 参与比较的第二个字符串。
n: 最多比较前 n 个字符。
return: 返回值含义与 strcmp()函数相同。

printf("%d\n", strncmp("ABC", "ABC", 3));	//0
printf("%d\n", strncmp("ABC", "ABCD", 3));	//0
printf("%d\n", strncmp("ABC", "ABCD", 4));	//-1

字符串查找

在给定的字符串中查找某个字符或字符串,并获取它的位置 : strchr()、strrchr()、 strstr()

strchr()

使用 strchr()函数可以查找到给定字符串当中的某一个字符

#include <string.h>
char *strchr(const char *s, int c);

s: 给定的目标字符串。
c: 需要查找的字符。
return: 返回字符 c 第一次在字符串 s 中出现的位置,未找到,则返回 NULL。

char *ptr = NULL;
char str[] = "Hello World!";
ptr = strchr(str, 'W');
if (NULL != ptr) {
	printf("Character: %c\n", *ptr);
	printf("ptr is: %s\n", ptr);
	printf("Offset: %d\n",  ptr - str );
}

//输出结果为
Character: W
ptr is: World!
Offset: 6

可以看出strchr返回第一个要查找的字符的指针, 实际结果就是返回第一个要查找的字符后面的字符串(并且包含此查找字符本身).

strrchr()

strrchr()函数在字符串中是从后到前(或者称为从右向左)查找字符,找到字符第一次出现的位置就返回,返回值指向这个位置

#include <string.h>
char *strrchr(const char *s, int c);
char *ptr = NULL;
char str[] = "I love my home";
	
ptr = strchr(str, 'o');
printf("ptr is: %s\n", ptr);
printf("strchr: %ld\n", ptr - str);
	
ptr = NULL;	
	
ptr = strrchr(str, 'o');
printf("ptr is: %s\n", ptr);
printf("strrchr: %ld\n", ptr - str);

//输出结果为
ptr is: ove my home
strchr: 3
ptr is: ome
strrchr: 11

strrchr函数是从后开始查找字符的

strstr()

strstr()可在给定的字符串 haystack 中查找第一次出现子字符串 needle 的位置

#include <string.h>
char *strstr(const char *haystack, const char *needle);

haystack: 目标字符串。
needle: 需要查找的子字符串。
return: 如果目标字符串 haystack 中包含了子字符串 needle,则返回该字符串首次出现的位置;未找到返回 NULL。

char *ptr = NULL;
char str[] = "I love my home";
	
ptr = strstr(str, "home");
	
printf("Character: %c\n", *ptr);	
printf("ptr is: %s\n", ptr);
printf("strrchr: %ld\n", ptr - str);

//输出结果为
Character: h
ptr is : home
strrchr: 10

字符串与数字互转

atoi()、 atol()

atoi 将字符串转换为 int
atol将字符串转换为 long int

#include <stdlib.h>
int atoi(const char *nptr);
long atol(const char *nptr);

nptr: 需要进行转换的字符串。
返回值: 分别返回转换之后得到的 int 类型数据、 long int 类型数据

printf("atoi: %d\n", atoi("500"));	//500
printf("atol: %ld\n", atol("500"));	//500	

strtol()

strtol()可以实现将多种不同进制数(譬如二进制的字符串、八进制的字符串、十六进制的字符串) 表示的字符串转换为long int 数据

#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);

nptr: 需要进行转换的目标字符串。
endptr: char **类型的指针, 如果 endptr 不为 NULL,则 strtol()或 strtoll()会将字符串中第一个无效字
符的地址存储在endptr 中。如果根本没有数字, strtol()或 strtoll()会将 nptr 的原始值存储在endptr 中(并返
回 0)。 也可将参数 endptr 设置为 NULL,表示不接收相应信息。

base: 数字基数, 参数 base 必须介于 2 和 36(包含)之间,或者是特殊值 0。 base 决定了字符串转换为整数时合法字符的取值范围譬如
当 base=2 时,合法字符为’ 0 ‘、 ’ 1 ’
当 base=8 时,合法字符为’ 0 '、 ’ 1 '、 ’ 2 ‘、 ’ 3 ‘……’ 7 ’
当 base=16 时,合法字符为’ 0 ’ 、 ’ 1 '、 ’ 2 '、 ’ 3 ‘……’ 9 '、 ’ a ‘……’ f ’
当 base 大于 10 的时候, ’ a '代表 10、 ’ b '代表 11、 ’ c '代表 12,依次类推, ’ z '代表 35 不区分大小写
在 base=0 的情况下, 如果字符串包含一个了“0x”前缀, 表示该数字将以 16 为基数; 如果包含的是“0”前缀,表示该数字将以 8 为基数。

printf("strtol: %ld\n", strtol("0x500", NULL, 16));	//1280
printf("strtol: %ld\n", strtol("0x500", NULL, 0));	//1280
printf("strtol: %ld\n", strtol("500", NULL, 16));	//1280
printf("strtol: %ld\n", strtol("0777", NULL, 8));	//511
printf("strtol: %ld\n", strtol("0777", NULL, 0));	//511
printf("strtol: %ld\n", strtol("1111", NULL, 2));	//15
printf("strtol: %ld\n", strtol("-1111", NULL, 2));	//-15

strtoul

使用方法与 strtol()一样,区别在于strtoul()返回值类型是 unsigned long int

#include <stdlib.h>
unsigned long int strtoul(const char *nptr, char **endptr, int base);
printf("strtoul: %lu\n", strtoul("0x500", NULL, 16));	//1280
printf("strtoul: %lu\n", strtoul("0x500", NULL, 0));	//1280
printf("strtoul: %lu\n", strtoul("500", NULL, 16));		//1280
printf("strtoul: %lu\n", strtoul("0777", NULL, 8));		//511
printf("strtoul: %lu\n", strtoul("0777", NULL, 0));		//511
printf("strtoul: %lu\n", strtoul("1111", NULL, 2));		//15

字符串转浮点型数据

atof()

#include <stdlib.h>
double atof(const char *nptr);

nptr: 需要进行转换的字符串。
return: 返回转换得到的 double 类型数据

printf("atof: %lf\n", atof("0.123"));		//0.123000
printf("atof: %lf\n", atof("-1.1185"));		//-1.118500
printf("atof: %lf\n", atof("100.0123"));	//100.012300

strtod() strtof()

strtof()、 strtod() 可分别将字符串转换为 float 类型数据、 double 类型数据

#include <stdlib.h>
double strtod(const char *nptr, char **endptr);
float strtof(const char *nptr, char **endptr);

使用与strtol()含义相同

printf("strtof: %f\n", strtof("0.123", NULL));			//0.123000
printf("strtod: %lf\n", strtod("-1.1185", NULL));		//-1.118500
printf("strtold: %Lf\n", strtold("100.0123", NULL));	//100.012300
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 标准库 string常用函数 笔记 的相关文章

  • 关于Charles抓包

    目录 抓包的原理 抓包的步骤 1 下载Charles 2 PC抓HTTPS协议的包 3 移动端抓包步骤 证书的原理 抓包的原理 抓包的软件非常多 xff0c 其实底层逻辑充当了一个中间人代理的角色来对HTTPS进行抓包 xff0c 结合日常
  • Ubuntu下使用CMakeLists.txt管理C/C++代码

    Ubuntu下使用CMakeLists txt管理C C 43 43 代码 一 CMakeLists txt入门知识1 CMakeLists txt的编译方法2 CMakeLists txt的文件内容3 编译的C文件 二 CMakeList
  • C语言中的__FILE__、__LINE__和__func__等预定义宏和注意事项

    C语言预处理要求定义某些对象宏 xff0c 运用这些预定义宏能使调试变得更简单 xff0c 每个预定义宏的名称一两个下划线字符开头和结尾 xff0c 这些预定义宏不能被取消定义 xff08 undef xff09 或由编程人员重新定义 常用
  • 树莓派4B ubuntu20.04 安装ROS noetic和opencv记录

    文章目录 准备换源安装ROS一些遇到的坑连接wifi添加秘钥时出错 E could not get lock var lib apt list catkin make时出现错误 Could not find the required com
  • c语言变量和常量

    c语言的常量和变量及其类型 常量以及常量的定义 变量 xff1a 在c语言中变量就是能够改变的量 常量 xff1a 就是在定义后不能去改变的值就是常量 int a 61 10 a 61 20 此时的a就是一个变量 const int a 6
  • 头文件中只有声明,没有定义

    前言 xff1a 头文件中只有声明 xff0c 而没有定义 这是为什么呢 xff1f 刚看到这个问题我也比较纳闷 因为我学C 43 43 之前一直是这样的 xff0c 直到学习了C 43 43 中的内联函数 xff0c 内联函数的声明和定义
  • STM32-printf重定向串口输出

    声明 本文内容转载至https www mculover666 cn posts 2251182441 1 printf与fputc printf 定义在 lt stdio h gt 头文件中 xff0c 如下 xff1a span cla
  • ZYNQ7020与PC机的UDP通信实现

    由于实验室项目需求开始学习ZYNQ7000系列开发板 xff0c 了解zunq的udp通信实现 xff0c 开发板的自带学习资料有 基于UDP的QSPI Flash bin文件网络烧写实验 xff0c 该实验的基本原理如下 首先 xff0c
  • CAN 与 CANFD数据报文格式解读

    ISO 11898 1 2015 协议详细定义了CAN网络报文的格式 xff0c 包含了传统CAN与CANFD帧格式 CAN网络的帧类型共有4种 xff0c 分别为数据帧 远程帧 错误帧 过载帧 本章将主要介绍CAN网络数据帧报文的格式 x
  • #define用法详解

    1 define 的作用 在 xff23 或C 43 43 语言源程序中允许用一个标识符来表示一个字符串 xff0c 称为 宏 被定义为 宏 的标识符称为 宏名 在编译预处理时 xff0c 对程序中所有出现的 宏名 xff0c 都用宏定义中
  • *32.什么是DMA方式?什么是中断方式?有什么区别?

    DMA是l O设备与主存之间由硬件组成的直接数据通路 xff0c 主要用于高速I xff0f O设备与主存之间的成组数据传送 xff08 外设快 慢了没意义 然后数据多 xff0c 少了也没多大意义 xff09 首先讲一下外设跟内存进行数据
  • http请求报文和响应报文

    一个HTTP请求报文由四个部分组成 xff1a 请求行 请求头部 空行 请求数据 1 请求行 请求行由请求方法字段 URL字段和HTTP协议版本字段3个字段组成 xff0c 它们用空格分隔 比如 GET data info html HTT
  • stm32标准库串口的硬件控制流不用也需要配置

    usart2 USART BaudRate 61 9600 usart2 USART HardwareFlowControl 61 USART HardwareFlowControl None usart2 USART Mode 61 US
  • 解决keil总是全部编译问题

    遇到keil总是全部编译 xff0c 极大影响开发效率 xff1a 找到网上的一些修改keil工程配置 xff0c 如 use cross module optimization 一项是被选中的 xff0c 我们只需要去掉这个勾选即可 但是
  • Maven问题-访问jsp页面报错org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException

    通过maven运行含有jsp页面的项目 xff0c 只要访问jsp页面资源 xff0c 就会报错 org eclipse jdt internal compiler classfmt ClassFormatException 原因 xff1
  • 第四节---数组

    本章重点 一维数组的创建和初始化一维数组的使用一维数组在内存中的存储二维数组的创建和初始化二维数组的使用二维数组在内存中的存储数组作为函数参数 一维数组的创建和初始化 数组的创建 数组是一组相同类型元素的集合 数组的创建方式 xff1a t
  • Uncaught (in promise) Error: Request failed with status code 500

    分享一些状态码400 404 500等原因 出错 前端 span class token comment 获取所有的导航菜单 span span class token keyword async span span class token
  • 【错误记录】Error creating bean with name: Unsatisfied dependency expressed through field

    启动一个Spring boot集成mybatis plus报错 xff1a Error creating bean with name examManageController Unsatisfied dependency expresse
  • vue响应的res.data和res.data.data

    今天因为搜索功能一直接收到了后台数据但是前端页面没有渲染出来很奇怪 xff0c 详细调试了好久 xff0c 试验 后端的数据 xff1a 64 span class token function GetMapping span span c
  • 【笔记】opencv阈值处理 threshold函数 cv2.THRESH_BINARY ,cv2.THRESH_TRUNC) cv2.adaptiveThreshold()

    像素是在模拟图像数字化时对连续空间进行离散化得到的 每个像素具有整数行 高 和列 宽 位置坐标 同时每个像素都具有整数灰度值或颜色值 threshold函数 返回的第一个参数为阈值 第二个为结果图像 ret dst cv2 threshol

随机推荐

  • 【项目实战】pytorch载入训练好的模型并进行可视化模型预测绘图

    main函数载入模型 xff0c 加载图片 xff0c 输出结果 xff1a span class token keyword if span name span class token operator 61 61 span span c
  • 【项目实战】vue-springboot-pytorch前后端结合pytorch深度学习 html打开本地摄像头 监控人脸和记录时间

    是一个项目的一个功能之一 xff0c 调试了两小时 xff0c 终于能够 javascript设置开始计和暂停计时 监控人脸 记录时间了 效果图 xff1a 离开页面之后回到页面会从0计时 xff08 不是关闭页面 xff0c 而是页面失去
  • 【flask学习笔记】flask与HTTP,flask与mongodb交互,用手机输入局域网ip访问flask界面

    文章目录 引入 xff08 关于http flask项目的配置 引入 xff08 关于http 当我们在浏览器中的地址栏中输入这个URL xff0c 然后按下Enter时 xff0c 稍等片刻 xff0c 浏览器会显示一个问候页面 这背后有
  • java什么是monitor和Monitor监视器锁、对象布局

    文章目录 Monitor监视器锁什么是moniter对象布局 Monitor监视器锁 每个同步对象都有一个自己的Monitor 监视器锁 xff0c 加锁过程如下图所示 xff1a 任何一个对象都有一个Monitor与之关联 xff0c 当
  • proto的介绍和基础使用

    内容摘抄自书籍 Netty redis zookeeper高并发实战 Protobuf使用 proto文件来预先定义的消息格式 数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码 proto文件 xff0c 简单地说 xf
  • springboot使用oshi获取系统cpu、内存、jvm信息

    OSHI 是基于 JNA 的 xff08 本地 xff09 操作系统和硬件信息库 它不需要安装任何其他额外的本地库 xff0c 旨在提供一种跨平台的实现来检索系统信息 xff0c 例如操作系统版本 进程 内存和 CPU 使用率 磁盘和分区
  • 常用的linux命令

    目录相关命令 xff1a ls 列出当前目录下的文件列表信息 目录 文件夹 当前 xff1a 登陆成功之后 xff0c 打开终端所处的一个目录 a 显示隐藏文件 linux下以 开头的文件是隐藏文件 xff0c 默认不显示 l 显示目录下文
  • 字节后端一二面,讯飞一面

    1 自我介绍 2 rdb aof 3 线程池 4 ping命令用了什么协议 5 应用层的协议 6 为什么四次挥手要timewait 7 算法题 xff1a 和为k的子数组个数 xff08 前缀和 xff09 8 幻读 7 隔离级别 8 tc
  • mysql以某个字段分组进行条件查询,如果为0则补0

    需求 xff1a 有一个version plan表 xff0c 其中有一个字段is urgent 且每个version plan与一个模块moduleId关联 xff0c 现在要查出is urgent为1的模块数和这个模块的总数 xff0c
  • 数据库系统第六章-关系数据理论复习

    候选码若关系中的一个属性或属性组的值能够唯一地标识一个元组 xff0c 且他的子集不能唯一的标识一个元组 xff0c 则称这个属性或属性组做候选码 函数依赖 范式 虽然STC xff08 S T C xff09 3NF xff0c 但它仍存
  • Spring Security登录验证过程详解

    前端 xff1a 在前端页面输入username和password 通过地址login访问验证 后台 xff1a 调用 AbstractAuthenticationProcessingFilter doFilter 方法 原因 xff1a
  • 关于STL的一些理解

    1 集合set 定义 xff1a set lt int gt s1 类型可选 se begin 返回指向第一个元素的迭代器 se clear 清除所有元素 常用 se count 返回某个值元素的个数 常用 xff0c 一般用来查这个元素在
  • ModuleNotFoundError: No module named ‘...’:报错解决方案

    1 module包没安装 这个 就是包的名字 xff0c 看问题定位 xff0c import源文件 xff0c 然后去site packages里找那个模块 xff0c 如果是空的没安装 xff0c 这时候可以在对应的环境里使用pip i
  • C语言----结构体,枚举,共用体

    1 xff09 结构体 span class token comment 例 xff1a 一个描述学生的结构体 span span class token keyword struct span span class token class
  • Nvidia jetson agx xavier can通讯失败,修改时钟源pllaon

    一 问题详情 在调试Xavier can的过程中 xff0c can通信始终有问题 xff0c 收发都会报错 后来发现时钟源导致波特率不匹配 xff0c 所以不能通信 二 修改时钟源 在虚拟机使用官方sdkmanager xff0c 下载安
  • linux下实现https访问

    http转https 适用于linux服务器 linux下nginx 43 ssl实现https访问 xff08 一 xff09 环境准备 xff08 二 xff09 下载nginx源码 xff0c 编译nginx并添加ssl模块 xff0
  • Nvidia Jetson nano 安装Archiconda、gpu版torch、踩坑记录

    Nvidia Jetson nano 安装Archiconda gpu版torch 踩坑记录 jetson nano 属于aarch64架构 xff0c 不同于一般的x86 64的linux系统架构 xff0c 而torch官网上面 htt
  • linux下的yum,vim,gcc,gdb

    我们在windows系统下我们能够很简单进行粘贴复制下载安装 xff0c 也能通过vs进行我们缩写代码的编译运行 xff0c 但是我们在linux下我们应该怎样去操作我们的这些命令呢 xff0c 这章我们就讲解一下我们linux下常用的一些
  • 【Keil】Keil5添加源程序和头文件

    xxx c就是源程序 xxx h就是头文件 源程序添加方法 双击文件夹 xff0c 例如图片上的Source xff0c 跳出弹窗 xff0c 选择需要添加的源程序即可 添加头文件的方法 1 首先点击图片红框处 xff0c 或是在文件夹te
  • C 标准库 string常用函数 笔记

    文章目录 64 TOC 文章目录 前言字符串长度strlen sizeof 字符串拼接strcat strncat 字符串拷贝strcpy strncpy memcpy 内存填充memset 字符串比较strcmp strncmp 字符串查