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

  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.hqwc.cn/news/333805.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快乐学Python,Python基础之代码复用?

上一篇文章中&#xff0c;我们了解了代码的分支结构&#xff08;if 家族语句&#xff09;和循环结构&#xff08;for 循环和 while 循环&#xff09;。通过了解这些结构&#xff0c;我们已经能够写出稍微复杂一些的代码。但当代码一多&#xff0c;就会遇到一些问题。 上一篇文…

韩语发音干货,零基础韩语学习,柯桥韩语知识点之发音规律

01.连音化 当收音遇到以元音为首音的音节时&#xff0c;收音要和该元音相连发音。 예: 독일[도길] 밥을 [바블] 우산이[우사니] 읽어요[일거요] 02.送气 ㄱ/ㄷ/ㅂ/ㅈ遇到ㅎ,送气化读成ㅋ/ㅌ/ㅍ/ㅊ 예: 어떻게[어떠케] 좋다[조타] 많지만[만치만] 백화점[배콰…

设计模式——工厂方法模式(Factory Method Pattern)

简单工厂模式 概述 说工厂方法模式之前&#xff0c;先说下简单工厂模式&#xff0c;简单工厂模式并不属于GoF 23个经典设计模式&#xff0c;但通常将它作为学习其他工厂模式的基础&#xff0c;它的设计思想很简单&#xff0c;其基本流程如下&#xff1a;首先将需要创建的各种不…

网络安全复习--简答整理

-----------------------------------------------------教材如上图------------------------------------------------------------ 1.对称加密和非对称加密各有什么特点&#xff1f;加密解密过程中有什么区别&#xff1f;优点P38【考】 对称加密的特点&#xff1a;在针对同一…

element plus 表格组件怎样在表格中显示图片

官方给的&#xff1a; <el-table-column label"Thumbnail" width"180"><template #default"scope"><div style"display: flex; align-items: center"><el-image :preview-src-list"srcList"/><…

信号的互相关计算及时延估计

1. 信号的互相关计算 互相关反映向量x和移位&#xff08;滞后&#xff09;向量y之间的相似性。 最直观的解释是&#xff1a;互相关的作用是为了找到信号在哪一时刻与另一信号最像&#xff08;另一信号为本身时就是自相关&#xff09;&#xff01; 滑动求互相关&#xff08;图…

全球化视野下的品牌出海:生态体系的构建与优化

随着全球化的不断深入&#xff0c;品牌出海已成为企业迈向国际市场的重要战略之一。在这个竞争激烈的时代&#xff0c;品牌要在国际市场上获得成功&#xff0c;不仅需要具备强大的产品力和市场洞察力&#xff0c;还需要构建和优化一个完善的生态体系。本文Nox聚星将和大家探讨在…

常见的Latex公式所用到的内容汇总

行内公式 f ( x ) a b f(x)ab f(x)ab 左右各加一个$&#xff0c;即为行内公式 $ f(x) ab $行间公式 $$ f(x) ab $$f ( x ) a b f(x)ab f(x)ab 手动编号 $$ f(x) a - b \tag{1.1} $$f ( x ) a − b (1.1) f(x)a-b \tag{1.1} f(x)a−b(1.1) 简单运算 -*/以及阿拉伯…

【已解决】Invalid bound statement (not found)

报错讯息 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.casey.mapper.SysRoleMapper.getUserRoleCode at org.apache.ibatis.binding.MapperMethod S q l C o m m a n d . < i n i t > ( M a p p e r M e t h o d . j a v a :…

Excel5:自动化周报的制作

自动化周报的数据引用来源于8月成交数据-纯数值表格&#xff0c;因为8月成交数据表格中部分单元格中有vlookup函数&#xff0c;且存在跨表连接。 对于跨表连接的解释和说明&#xff1f; 首先打开我们之前做好的成交数据。打开后我们可以看到这上面出现了一个安全警告&#xff0…

Java中的装箱和拆箱

自动装箱和拆箱问题是Java中一个老生常谈的问题了&#xff0c;今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西&#xff0c;再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 一.什么是装箱&#xff1f;什么是拆箱&#xff1f; 我们…

Flutter桌面软件开发中实现本地通知

Flutter桌面软件开发中实现本地通知可以使用local_notifier &#xff0c;local_notifier这个插件允许 Flutter 桌面 应用显示本地通知。 Flutter桌面软件开发中实现本地通知 第一步安装依赖 dependencies:local_notifier: ^0.1.5 Flutter桌面软件开发中实现本地通知 第二步配…