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接口实现跨部门在线数据交互;大数…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
