C语言中常用的字符串函数(strlen、sizeof、sscanf、sprintf、strcpy)

news2024/11/17 1:55:34

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语言中,字符串并没有作为一种独立的数据类型进行定义。相反,字符串被表示为字符数组或字符指针。以下是两种常见的表示字符串的方法:

  1. 使用字符数组:
char str[20] = "Hello, World!"; // 声明一个字符数组来存储字符串
  1. 使用字符指针:
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;
}

在这里插入图片描述

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

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

相关文章

【C语言题解】 | 572. 另一棵树的子树

572. 另一棵树的子树 572. 另一棵树的子树代码 572. 另一棵树的子树 该题目需要判断一二叉树是否为另一二叉树的子树 像此类&#xff0c;就不算是root的子树 此题的思路为&#xff1a; 传入subRoot&#xff0c;与root相比较&#xff0c;判断二者是否相同 若与root不相同&#…

Java学习笔记-day02-Flowable基础API小结

1.创建ProcessEngine 使用编码创建 Testpublic void processEngine01(){// 获取 ProcessEngineConfiguration 对象ProcessEngineConfiguration configuration new StandaloneProcessEngineConfiguration();// 配置 相关的数据库的连接信息configuration.setJdbcDriver("…

网安入门12-文件上传(黑白名单,00截断)

黑名单绕过 Pass-03 有的时候后端限制了一些黑名单&#xff0c;比如过滤后缀名.php 我们就可以用黑名单里没有的后缀名进行绕过&#xff0c;例如&#xff1a; 大小写&#xff1a;.phP .pHp .AsPphp1 .php2 .php3 .php9 .phtml&#xff08;成功率较高&#xff09;特殊文件名绕…

TypeScript基础(三)扩展类型-接口和类型兼容性

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

一文详解VScode 的远程开发

VS code登录服务器后进行编码和调试&#xff0c;VS code上的所有功能都可以使用&#xff0c;和在本地开发基本无区别。 一、配置免密远程登录 因为是要远程登录&#xff0c;那么需要通过使用ssh进行密钥对登录&#xff0c;这样每次登录服务器就可以不用输入密码了。 先来一句官…

【复习】人工智能 第2章 知识表示

一、 知识的概念 &#xff08;1&#xff09;知识&#xff1a;把有关信息关联在一起所形成的信息结构。 注&#xff1a;事实与规则的区别&#xff1a; 事实 —— “雪是白色的” 大自然自带的 规则 —— “如果头痛且流涕&#xff0c;则有可能患了感冒” 有点推理意味的 &…

服务器监控软件夜莺使用(二)

文章目录 一、采集器安装1. Categraf简介2. Categraf部署3. 测试服务器部署4. 系统监控插件5. 显卡监控插件6. 服务监控插件 二、监控仪表盘1. 机器列表2. 系统监控3. 服务监控 三、告警配置1. 邮件通知2. 告警规则3. 告警自愈 一、采集器安装 1. Categraf简介 Categraf 需要…

QTableView和QTableWidget之间的联系 和 区别?什么时候该用QTableView,什么时候该用QTableWidget?

参考&#xff1a;tableview与tablewidget的区别_wx64f5321a2db60的技术博客_51CTO博客 QTableView 和 QTableWidget 是 Qt 中用于显示和编辑表格数据的两个不同的部件&#xff0c;它们之间存在一些重要的区别&#xff1a; 一、主要区别是&#xff1a;QTableView可以使用自定义…

拥有影响力,项目经理才能如鱼得水

优秀的项目经理&#xff0c;不仅需要具备卓越的组织和协调能力&#xff0c;还需要拥有足够的影响力&#xff0c;以便能够推动项目的顺利进行。然而&#xff0c;现实情况是&#xff0c;许多项目经理并没有意识到影响力的重要性&#xff0c;导致他们在工作中事半功倍&#xff0c;…

中国建设银行 关于解决微软升级导致插入网银盾无法自动打开企业网银的通知

关于解决微软升级导致插入网银盾无法自动打开企业网银的通知 发布时间&#xff1a;2023-10-18 尊敬的客户&#xff1a; 近期Windows操作系统升级会禁止使用IE浏览器&#xff0c;可能会导致您在插入网银盾后无法自动弹出企业网银登录页面&#xff0c;您可以通过以下方式解决&…

一篇文章带您了解如何实现WordPress主题/插件本地化翻译

要实现WordPress主题和插件的本地化翻译就需要了解什么是国际化和本地化以及WordPress是如何实现国际化和本地化的。 什么是国际化&#xff1f; 国际化是为软件&#xff08;在本例中为 WordPress&#xff09;提供多语言支持的过程。国际化通常缩写为 i18n&#xff0c;其中 18 代…

Zoho Mail企业邮箱:跨境协作的利器,荣登Top榜单

在全球化的商业环境中&#xff0c;高效的协作工具对于企业及个人来说都至关重要。邮件因其自身规格正式、全球通用等特点&#xff0c;在跨境通信场景中仍然是最高频使用的工具之一。 Zoho Mail企业邮箱因邮件抵达率高&#xff0c;数据加密严&#xff0c;纯净无广告&#xff0c;…

数据分析求职-常见面试题前言

今天和大家聊聊数据分析求职常见面试题&#xff0c;这是这个系列的第一篇文章&#xff0c;但是我不想开始就直接罗列题目&#xff0c;因为这样的文章实在太多了&#xff0c;同学们的兴趣程度肯定一般。所以&#xff0c;我想先和大家聊聊在准备面试题时候通常遇到的困扰&#xf…

京东年度数据报告-2023全年度打印机十大热门品牌销量(销额)榜单

2023年度&#xff0c;打印机消费市场的销售总量呈现下滑。根据鲸参谋平台的数据显示&#xff0c;京东平台上打印机市场的年度销量为650万&#xff0c;同比下滑约9%&#xff1b;销售额将近55亿&#xff0c;同比下滑约10%。 在这里&#xff0c;鲸参谋平台综合了京东平台上电脑办公…

第17集《佛法修学概要》

戊四、业果轻重 诸位法师慈悲&#xff01;陈会长慈悲&#xff01; 诸位学员&#xff01;阿弥陀佛&#xff01; 请大家打开讲义第四十二页。 我们讲到戊四、业果轻重。业果的轻重有三段&#xff1a;第一个约心&#xff1b;第二个约境&#xff1b;第三个约相续。我们讲到第二…

Vue3+Vite打包跨平台(七牛、阿里OSS)上传部署前端项目

1、业务场景 阅读之前&#xff0c;想了解一下各位观众老爷们&#xff0c;你们公司的项目是怎么部署的&#xff1a; 1.本地打包手动上传服务器&#xff1b; 2.本地打包自动上传服务器&#xff1b; 3.代码仓库流水线自动构建&#xff1b; 4.其他…&#xff1b; 我们用的第3种部…

认知能力测验,⑦如何破解类比推理类测试题?

关于认知能力测评&#xff0c;今天这稿算是最后一篇&#xff0c;一共写了7篇&#xff0c;分别是数字推理、逻辑思维、语言常识、数量关系、图形推理、逻辑判断、和类比推理。 不论是校招、社招、网申、还是行测&#xff0c;在线人才测评已经是普遍普及的想象&#xff0c;而认知…

BUUCTF--ciscn_2019_s_31

这题是一题ret2csu,先查看下保护&#xff1a; 64位架构的程序&#xff0c;那么传参就是寄存器传参了。开启了NX&#xff0c;也不存在ret2shellocde。接下来黑盒测试下&#xff1a; 输入一个字节都能触发段错误&#xff0c;并且还跟了一串不知道啥来的东西&#xff0c;盲猜是栈上…

HTML5+CSS3小实例:弹出式悬停效果

实例:弹出式悬停效果 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><m…

[Markdown] Markdown常用快捷键分类汇总

文章目录 Markdown1、标题2、列表3、强调4、链接和图片5、代码和公式6、表格和任务列表7、引用8、分割线9、脚注10、目录11、注释12、定义 Markdown Markdown是一种轻量级的标记语言&#xff0c;可以让你用简单的语法来编写格式丰富的文档。 Markdown编辑器是一种专门用于编辑…