C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)
C语言中常用的字符串函数
文章目录
- C语言中常用的字符串函数
- 1 strlen函数
- 2 sizeof函数
- 2.1 sizeof介绍
- 2.2 sizeof用法
- 3 sscanf函数
- 3.1 sscanf介绍
- 3.2 sscanf用法
- 3.3 sscanf高级用法
- 4 sprintf函数
- 4.1 背景
- 4.2 sprintf用法
- 5 strcpy函数
- 5.1 strcpy介绍
- 5.1 strcpy用法
1 strlen函数
strlen即为string length,顾名思义该函数是用来求字符串长度的。在介绍strlen函数之前,我们要先介绍一下"\0"这个转义字符。任何一个字符串后面都会隐藏一个"\0",该转义字符是字符串结束的标志,所以我们在使用strlen函数求字符串长度时,遇到"\0"时停止读取,此时"\0"前的字符个数就是字符串的长度。
注意:
这里的"\0"只是结束标志,并不算一个字符!
示例1:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{printf("%d\n", strlen("xxccyy"));system("pause");return 0;
}
我们将字符串"xxccyy"在内存的存储结构展示如下:
示例2:
在c语言中,字符串并没有作为一种独立的数据类型进行定义。相反,字符串被表示为字符数组或字符指针。以下是两种常见的表示字符串的方法:
- 使用字符数组:
char str[20] = "Hello, World!"; // 声明一个字符数组来存储字符串
- 使用字符指针:
char *str = "Hello, World!"; // 声明一个指向字符的指针,指向字符串常量
接下来我们介绍使用字符数组存储字符串的每一个字符,使用这种定义方式对于strlen的求解有何不同呢?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char arr1[] = {'x','x','c','c','y','y'};char arr2[] = {'x','x','c','c','y','y','\0'};printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));system("pause");return 0;
}
arr1数组只是单纯把字符串“abcdef”的每一个字符用数组存储起来,而arr2数组则是多存储了一个“\0",可以看到arr1数组的长度为9,arr2数组的长度为6,接下来我们将展示两个数组在内存中的存储状态。
arr2数组的存储情况和示例1字符串的存储情况相同,而arr1却不同。对于arr2我们不进行说明,接下来我们分析下为什么arr1数组的长度为9。
上文我们说过字符串结束标志为"\0",但是我们的arr1数组没有额外存储"\0",所以编译器在读取时,并不会像我们所期望的那样停止读取,故长度当然不会为6。但是为什么最终读取的长度为9,是因为在读取时,编译器读取完arr1时会继续往后读取,直到读取到”\0",arr1在读取完第9个字符后才会遇到”\0";由于每个人的电脑和编译器不同,读取的长度也不一样,所以arr1这种情况一般我们认为它读取的结果为随机值!
示例3:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{printf("%d\n", strlen("xcy\0zfr"));system("pause");return 0;
}
示例3是为了进一步说明字符串结束标志"\0"的重要性。
2 sizeof函数
2.1 sizeof介绍
sizeof是计算变量在内存的占空间的大小,单位是字节。
2.2 sizeof用法
- 使用sizeof查看数据类型占空间大小
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{printf("sizeof(char): %d\n", sizeof(char));printf("sizeof(short): %d\n", sizeof(short));printf("sizeof(int): %d\n", sizeof(int));printf("sizeof(long): %d\n", sizeof(long));printf("sizeof(long long): %d\n", sizeof(long long));printf("sizeof(float): %d\n", sizeof(float));printf("sizeof(double): %d\n", sizeof(double));system("pause");return 0;
}
- 使用sizeof计算基本数据类型变量的占用空间的大小
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char c = 'a';int i = 1;short s = 1;long l = 1;long long ll = 1;float f = 1.0;double d = 1.0;printf("sizeof(c): %d\n", sizeof(c));printf("sizeof(s): %d\n", sizeof(s));printf("sizeof(i): %d\n", sizeof(i));printf("sizeof(l): %d\n", sizeof(l));printf("sizeof(ll): %d\n", sizeof(ll));printf("sizeof(f): %d\n", sizeof(f));printf("sizeof(d): %d\n", sizeof(d));system("pause");return 0;
}
- 使用sizeof计算指针的占用空间大小
需要注意的是,32位平台所有类型的指针的占用空间大小都是4个字节,64位平台所有类型的指针占用的空间大小为8个字节,观察如下代码:
#include <stdio.h>
#include <stdlib.h>int main()
{printf("sizeof(char*): %d\n", sizeof(char*));printf("sizeof(short*): %d\n", sizeof(short*));printf("sizeof(int*): %d\n", sizeof(int*));printf("sizeof(long*): %d\n", sizeof(long*));printf("sizeof(long long*): %d\n", sizeof(long long*));printf("sizeof(float*): %d\n", sizeof(float*));printf("sizeof(double*): %d\n", sizeof(double*));system("pause");return 0;
}
- 计算数组元素的个数
如想得到数组的元素个数,有以下两种方法:
1.总长度/相对应的数据类型长度
2.总长度/首元素长度
#include <stdio.h>
#include <stdlib.h>int a[]={1,2,3,4,5};
short b[]={1,2,3,4,5};
long c[]={1,2,3,4,5};
float d[]={1,2,3,4,5};
double e[]={1,2,3,4,5};
char f[]="12345";int main(void)
{printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d\n",sizeof(a)/sizeof(int), sizeof(b)/sizeof(short), sizeof(c)/sizeof(long),sizeof(d)/sizeof(float),sizeof(e)/sizeof(double),sizeof(f)/sizeof(char));printf("a=%d,b=%d,c=%d,d=%d,e=%d,f=%d\n",sizeof(a)/sizeof(a[0]), sizeof(b)/sizeof(b[0]), sizeof(c)/sizeof(c[0]),sizeof(d)/sizeof(d[0]),sizeof(e)/sizeof(e[0]),sizeof(f)/sizeof(f[0]));system("pause");return 0;
}
3 sscanf函数
3.1 sscanf介绍
sscanf函数是C语言中的一个标准库函数,用于从格式化的字符串中读取输入。
sscanf的函数原型:
#include <stdio.h>
int sscanf(const char *str, const char *format, ...);
其中,str表示要读取的字符串,format表示格式控制字符串,…表示可变参数列表。
3.2 sscanf用法
- 整形数据转换
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{int year, month, day;int converted = sscanf("20231215", "%04d%02d%02d", &year, &month, &day);printf("converted=%d, year=%d, month=%d, day=%d\n", converted, year, month, day);system("pause");return 0;
}
“%04d%02d%02d"是用来解析字符串的格式,%表示格式转换的开始,d表示转换为一个整数,04作为d的修饰,表示这是一个长度为4位的整数,不足4位时以0补齐。
返回值converted等于3,表示有3个数据成功转换,转换成功数目同时取决于被解析的字符串以及其转换格式,如果我们把例子中的格式改为”%04d%02d",那么sscanf将只返回2,day的数值不会被sscanf更改。
- 浮点数转换
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{double longitude, latitude;int converted = sscanf("113.123456789,31.123456789", "%lf,%lf", &longitude, &latitude);printf("converted=%d, longitude=%.9lf, latitude=%lf\n", converted, longitude, latitude);system("pause");return 0;
}
sscanf的格式字符串中,f表示这是一个浮点数,其修饰词l表示这是一个double的浮点数。
3.3 sscanf高级用法
取到指定字符为止:运算符 %[ ]
- 遇到空格为止
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char str[100];sscanf("Lucky xu123", "%[^ ]", str); //取遇到空格为止字符串 printf("str=%s\n", str); system("pause");return 0;
}
- 遇到指定字符为止
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char str[100];sscanf("Lucky xu123", "%[^1]", str); //取遇到空格为止字符串 printf("str=%s\n", str); system("pause");return 0;
}
我们设定运算符为% [^1] ,即遇到1截止,最终结果也符合预期。
- 取仅包含指定字符集
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char str[100];sscanf("654321abcdedfABCDEF", "%[1-9a-z]", str); //只取数字和小写字符printf("str=%s\n", str); system("pause");return 0;
}
[a-z]表示读取a-z的所有字符,[^a-z]表示读取除a-z以外的所有字符 。
- 取到指定字符集为止
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char str[100];sscanf("BCDEF123456abcdedf", "%[^a-z]", str); //取遇到小写字母为止的字符串 printf("str=%s\n", str); system("pause");return 0;
}
4 sprintf函数
4.1 背景
在使用STM32驱动TFT屏幕时,发现厂家给的驱动函数只支持16位无符号整形数据,即可显示的范围为0~65535,那么我们想显示65535以外的数则需要自己写驱动函数,本着偷懒的原则我发现了厂家提供了字符串驱动函数,那么我们只需要将65535以外的数转为字符串进行显示即可。
这便需要使用我们的sprintf函数,sprintf的函数原型:
#include <stdio.h>
int sprintf( char *buffer, const char *format, [ argument] … );
参数列表:
buffer:char型指针,指向欲写入的字符串地址。
format:char型指针,指向的内存里面存放了格式字符串。
[argument]…:可选参数,可以是任何类型的数据。
返回值:字符串长度(strlen)
4.2 sprintf用法
- 将 %f 格式的数据写入到字符串中
#define _USE_MATH_DEFINES 1 //如果要使用<math.h>里面的宏,需要定义_USE_MATH_DEFINES
#include <stdio.h>
#include <math.h>
#include <stdlib.h>int main()
{char str[80];sprintf(str, "Pi 的值 = %f", M_PI);puts(str);system("pause");return(0);
}
- 字符串写入字符串中
#include <stdio.h>
#include <stdlib.h>int main()
{char dest[20];sprintf(dest, "Hello World!");puts(dest);system("pause");return 0;
}
- 多个格式的写入
#include <stdio.h>
#include <stdlib.h>int main()
{int num = 886;char str[] = "byebye";char dest[20];sprintf(dest, "%s is %d", str, num);puts(dest);system("pause");return 0;
}
- 观察函数的返回值
sprintf函数的返回值不包含目标字符串末尾自动添加的’\0’
#include <stdio.h>
#include <stdlib.h>int main()
{int num = 886;char str[] = "byebye";char dest[20];int len = sprintf(dest, "%s is %d", str, num);puts(dest);printf("len = %d\n", len);system("pause");return 0;
}
- 指定起始目标字符串地址
当你想要在一个字符数组的某个位置开始时,那么第一个参数就要传对应位置的地址。
#include <stdio.h>
#include <stdlib.h>int main()
{char dest[40] = "I love ";char str[] = "this world!";sprintf(dest + 7, str);puts(dest);system("pause");return 0;
}
- 格式化字符数组
#include <stdio.h>
#include <stdlib.h>int main()
{char a[100] = { 0 };sprintf(a, "你好,我是%s博主", "Jack.xu");printf("%s\n", a);system("pause");return 0;
}
- 字符串的拼接
#include <stdio.h>
#include <stdlib.h>int main()
{char dest[100];char str1[] = "Hello";char str2[] = "World!";int len1 = sprintf(dest, "%s, % s", str1, str2);printf("%s\n%d\n", dest, len1);system("pause");return 0;
}
- 数字转换成字符串
#include <stdio.h>
#include <stdlib.h>int main()
{unsigned int number = 655350;char buffer[10];sprintf(buffer, "%d", number);printf("%s\n",buffer);system("pause");return 0;
}
在这里我们将655350转化为字符串。可以看出,利用sprinrf函数可以解决我们背景中的问题。
5 strcpy函数
5.1 strcpy介绍
strcpy函数是将一个字符串复制到另一块空间地址中的函数,‘\0’是停止拷贝的终止条件,同时也会将 ‘\0’ 也复制到目标空间。
strcpy的函数原型:
#include <string.h>
char *strcpy(char *dest, const char *src);
函数的参数:
- char *dest------------目标字符串的首地址
- const char *src------源地址:被复制的字符串的首地址,用const修饰,避免修改掉被拷贝的字符串
函数的返回值类型:
- char*:返回的是目标字符串的首地址
5.1 strcpy用法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char arr[10] = { 0 };const char* p = "abcdef";strcpy(arr, p);printf("%s\n", arr);system("pause");return 0;
}
相关文章:

C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)
C语言中常用的字符串函数 文章目录 C语言中常用的字符串函数1 strlen函数2 sizeof函数2.1 sizeof介绍2.2 sizeof用法 3 sscanf函数3.1 sscanf介绍3.2 sscanf用法3.3 sscanf高级用法 4 sprintf函数4.1 背景4.2 sprintf用法 5 strcpy函数5.1 strcpy介绍5.1 strcpy用法 1 strlen函…...
域名解析服务器:连接你与互联网的桥梁
域名解析服务器:连接你与互联网的桥梁 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将探讨一个网络世界中至关重要却鲜为人知的角…...
理论物理在天线设计和射频电路设计中的应用
理论物理的基本原理可以应用于电路中的电磁场分析和电磁波传播问题,例如天线设计和射频电路设计。通过应用麦克斯韦方程组和电磁波传播理论,可以优化电路的性能,提高天线的辐射效率和射频电路的传输效率。麦克斯韦方程组是描述电磁场行为的基…...

MySql01:初识
1.mysql数据库2.配置环境变量3. 列的类型和属性,索引,注释3.1 类型3.2 属性3.3 主键(主键索引)3.4 注释 4.结构化查询语句分类:5.列类型--表列类型设置 1.mysql数据库 数据库: 数据仓库,存储数据,以前我…...

Python——运算符
num 1 num 1 print("num1:", num) num - 1 print("num-1:", num) num * 4 print("num*4:", num) num / 4 print("num/4:", num) num 3 num % 2 print("num%2:", num) num ** 2 print("num**2:", num) 运行结果…...

赋能软件开发:生成式AI在优化编程工作流中的应用与前景
随着人工智能(AI)技术的快速发展,特别是生成式AI模型如GPT-3/4的出现,软件开发行业正经历一场变革,这些模型通过提供代码生成、自动化测试和错误检测等功能,极大地提高了开发效率和软件质量。 本文旨在深入…...

通过盲对抗性扰动实时击败基于DNN的流量分析系统
文章信息 论文题目:Defeating DNN-Based Traffic Analysis Systems in Real-Time With Blind Adversarial Perturbations 期刊(会议):30th USENIX Security Symposium 时间:2021 级别:CCF A 文章链接&…...

【Project】TPC-Online Module (manuscript_2024-01-07)
PRD正文 一、概述 本模块实现隧道点云数据的线上汇总和可视化。用户可以通过注册和登录功能进行身份验证,然后上传原始隧道点云数据和经过处理的数据到后台服务器。该模块提供数据查询、筛选和可视化等操作,同时支持对指定里程的分段显示和点云颜色更改…...

通过cpolar在公网访问本地网站
通过cpolar可以轻松将本地网址映射到公网进行访问,下面简要介绍一下实现步骤。 目录 一、cpolar下载 二、安装 三、使用 3.1 登录 3.2 创建隧道 一、cpolar下载 cpolar官网地址:cpolar - secure introspectable tunnels to localhost 通过QQ邮箱…...
Prokka: ubuntu安装的时候出现错误
[14:10:57] Running: cat /app/prokka_result/ref_file/ref_file.HAMAP.hmm.tmp.77.faa | parallel --gnu --plain -j 2 --block 108208 --recstart ‘>’ --pipe hmmscan --noali --notextw --acc -E 1e-09 --cpu 1 /opt/prokka/db/hmm/HAMAP.hmm /dev/stdin > /app/pro…...
安全防御之密码技术
密码学是信息安全的基础技术之一,是达到信息系统安全等级保护要求的核心技术支持,在身份验证、访问控制、文件加密、数据加密和安全传输中都得到广泛应用。其核心目标是保证信息的机密性、完整性和可用性。 密码学包括加密和解密两个部分。一般过程是&am…...

一文读懂「多模态大模型」
学习资源 5-多模态大模型一统NLP和CV 1.多模态大模型的基本原理 2.常见的多模态大模型 https://www.bilibili.com/video/BV1NN41177Zp?p5&vd_sourcef27f081fc77389ca006fcebf41bede2d 3.多模态大模型如_哔哩哔哩_bilibili 强强联手!科大讯飞和中科院终于把【…...
深入PostgreSQL:高级函数用法探索
写在开头 在 PostgreSQL 中,函数是数据库开发和管理中强大而灵活的工具。通过深入了解高级函数用法,我们可以更有效地利用 PostgreSQL 的功能。在本文中,我们将探讨一些看起来比较高级的 PostgreSQL 函数用法,包括窗口函数、自定义聚合函数、JSONB 类型函数、全文搜索、PL…...
huggingface实战bert-base-chinese模型(训练+预测)
文章目录 前言一、bert模型词汇映射说明二、bert模型输入解读1、input_ids说明2、attention_mask说明3、token_type_ids说明4、模型输入与vocab映射内容二、huggingface模型数据加载1、数据格式查看2、数据dataset处理3、tokenizer处理dataset数据三、huggingface训练bert分类模…...

CCS安装和导入项目及编译教程
1. CCS安装# 在 TI官网 下载离线版(offline)。 Code Composer Studio Downloads 页面上有license 信息:这么看来是免费的,爱了爱了 Licensing: CCSv7 and later are Technology Software Publicly Available (TSPA) compliant.…...
在React里面使用mobx状态管理详细步骤
1、安装MobX和MobX React: 在你的项目目录下运行以下命令安装MobX和MobX React: npm install mobx mobx-react2、创建MobX Store: 创建一个用于管理状态的MobX Store。这个Store应该包含你希望全局管理的状态和相关的操作。以下是一个简单…...

1.6PTA集练7-5~7-24、7-1、7-2,堆的操作,部落冲突(二分查找)
7-5 大師と仙人との奇遇 分数 20 #include<iostream> #include<queue> using namespace std; int n; long long ans0,num; priority_queue<long long,vector<long long>,greater<long long>>q;//记录之前买的,用小顶堆,最上面就是最…...
uniapp向上拉加载,下拉刷新
目录 大佬1大佬2 大佬1 大佬地址:https://blog.csdn.net/wendy_qx/article/details/135077822 大佬2 大佬2:https://blog.csdn.net/chen__hui/article/details/122497140...

目标检测脚本之mmpose json转yolo txt格式
目标检测脚本之mmpose json转yolo txt格式 一、需求分析 在使用yolopose及yolov8-pose 网络进行人体姿态检测任务时,有时需要标注一些特定场景的中的人型目标数据,用来扩充训练集,提升自己训练模型的效果。因为单纯的人工标注耗时费力&…...

大数据技术在民生资金专项审计中的应用
一、应用背景 目前,针对审计行业,关于大数据技术的相关研究与应用一般包括大数据智能采集数据技术、大数据智能分析技术、大数据可视化分析技术以及大数据多数据源综合分析技术。其中,大数据智能采集数据技术是通过网络爬虫或者WebService接口实现跨部门在线数据交互;大数…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
Monorepo架构: Nx Cloud 扩展能力与缓存加速
借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...
AWS vs 阿里云:功能、服务与性能对比指南
在云计算领域,Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商,各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5],我将从功能、服务和性能三个方面进行结构化对比分析&#…...

【汇编逆向系列】六、函数调用包含多个参数之多个整型-参数压栈顺序,rcx,rdx,r8,r9寄存器
从本章节开始,进入到函数有多个参数的情况,前面几个章节中介绍了整型和浮点型使用了不同的寄存器在进行函数传参,ECX是整型的第一个参数的寄存器,那么多个参数的情况下函数如何传参,下面展开介绍参数为整型时候的几种情…...