C语言易错知识点(3):字符数组的修改、sscanf、sprintf

字符数组是一个很细节的语法,涉及很多知识点,这篇文章我主要分享一下如何理解字符数组,以及对应的sscanf、sprintf有什么用

1.字符数组的初始化以及内容修改易错点

字符数组的初始化方式有两种,一种是直接用字符串进行初始化,另一种是大括号加上字符或字符串进行初始化

8b82c40a3d2f40aeba75c57c6dfbf247.png

这两种初始化方式均可,但是如果我现在想要更改数组的内容呢,那应该怎样操作?

很多人会第一时间想到直接给arr赋上一个新的字符串,但这显然是不行的。

55eaaeef02944073b5799eb7a3be0d27.png

接下来分析原因:

a.数组名的理解:我们要清楚字符数组的数组名是首元素地址。更详细地说,数组名arr是一个指针类型,其存储的值是首元素地址。对于这个变量有一个特殊操作就是&arr,这个操作是取出整个数组的地址,整个数组的地址是首元素的地址,所以&arr和arr得到的值是相同的。但由于这个特殊操作,我们无法得到存储arr这个指针的地址,不过这确实没有任何意义,很多人甚至都意识不到这个问题。62316d19a20a4dc5be0a82d68e46bdbd.png

arr这个指针还有个常属性,即arr存储的值不能被修改,类似于const int* p,这就导致arr的指向的空间区域在一开始就确定了,不能被修改了。

b.表达式的返回值:我们还要清楚表达式的返回值是存储在一个临时变量里的,这个临时变量同样具有常属性,这个临时变量我们是看不到的,如果有变量接收就把这个临时变量的值赋给这个变量。如果学过C++的引用,那么我们对这个临时变量的印象就会很深刻。

在字符数组的两种初始化表达式语句中,"Hello"返回的值是字符'H'的首元素地址,{'Hell", 'o'}返回的也是括号内第一个字符'H'的地址。更详细一点,就是这些初始化表达式的值(地址)存到一个临时变量里,再把临时变量里的这个地址赋给arr这个指针,完成初始化。

后续对字符串的访问其实就是靠的这个返回的地址的。

下面看一种情况:

8a88f02b8c38425db14edcfef4a9233e.png

这种情况也同理,只有在定义的时候,在arr这个指针还没有明确指向哪一块空间的时候,我们可以对它初始化,但如果不初始化,那么编译器会自动分配一块空间并把这块空间的最低地址赋给指针arr,这个时候arr就再也无法进行修改了。在上面这张图中,我们可以看到如果我们想要将"Hello"存到数组,直接赋值操作是不行的,因为就像上面所说的,arr = "Hello";本质是修改arr这个指针存储的值,这是绝对不允许的。我们明显需要其它方法来实现这种操作,达到在这块指定的空间里修改值的操作。

2.为什么字符数组会遇到这种情况

其实arr具有的常属性适用于所有的数组,一旦数组被定义了,首元素的地址是一定不能变的。

至于在int、float、double等类型的数组我们很少遇到这个情况,是因为几乎没有人会写出下面的代码:

b224a25c1569403eb3fd6de541433058.png

一般而言,我们都会针对arr[0]这种写法来修改数组里面的值,这其实就相当于在指定空间里面修改值的操作,而不是直接去修改arr指向的空间。

但是字符数组里面存储的信息大多是连续的,如一个单词,一个句子,我们需要批量修改字符数组里面的值,单个字符修改太慢,且又不能使用循环来解决,因此我们才会容易犯上面的错误。而这个需求在其它类型的数组里面遇到的情况相对较少,通常都是针对某个数据进行修改,如果是批量修改,写很容易通过循环来解决。

3.字符串或内存函数解决方案

有以下几种函数可以帮助我们批量修改字符串中的值,它们都是直接到对应内存区域里修改值实现的。

(1)strcpy

标准格式:char * strcpy ( char * destination, const char * source )

(2)strcat

标准格式:char * strcat ( char * destination, const char * source );

(3)memcpy

标准格式:void * memcpy
 ( void * destination, const void * source, size_t num );

(4)memmove 

标准格式:void * memmove ( void * destination, const void * source, size_t num );

其中内存函数的第三个参数是拷贝的字节,一般情况推荐用memmove 

4.sscanf和sprintf

上面的字符串函数和内存函数已经可以实现我们全部的需求,但是仍然不方便,这个时候就可以考虑sprintf。

sprintf就是将我们想要输入的任何数据直接存入字符数组中。

ba51f418545e4bf5ae7c6c2c6daebb1a.png

我们把数组的地址传过去,函数就能自动找到对应的区域并将这块区域的数据进行修改。

这非常方便,同时这个函数也可以使用占位符,和printf一致。

57f96d03636e49d4ba260de389ebd413.png

sscanf也是对字符数组内的数据进行操作,和scanf的功能类似。但是scanf是需要我们从屏幕中输入数据,再进行读取。而sscanf是直接在字符串中对数据进行读取。读取的规则和scanf一致。

d15f0aa5d73f4078a5c8f091f506a9b4.png

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯第2152题——红绿灯

问题描述 爱丽丝要开车去上班, 上班的路上有许多红绿灯, 这让爱丽丝很难过。为 了上班不迟到, 她给自己的车安装了氮气喷射装置。现在她想知道自己上班最 短需要多少时间。 爱丽丝的车最高速度是 米每秒, 并且经过改装后, 可以瞬间加速到小于 等于最高速的任意速度, 也可以瞵…

(Java)数据结构——图(第五节)Kruskal的实现最小生成树(MST)

前言 本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。 Kruskal算法(Kruskal的实现原理) Kruskal算法的原理: 就是每次取最小的边,看看是不是与已经选择的构成回路&#x…

imu6xl点灯(C语言)

参考正点原子开发指南 根据原理图可以看出,我们需要设置低电平导通电路。 在原理图上找到LED0,对应IO为GPIO3 IO复用配置 IMX6UL每个引脚都可以复用 在用户手册第30章可以找到IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03这个寄存器,地址为0x020E0068&…

洛谷-P1036 [NOIP2002 普及组] 选数

P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; const int N30; int n,r; int g[N]; //存用户输入的数 int arr[N]; //存答案 int res0; //存种类数bool is_prime(int y){ //求素数if(y<2){…

HarmonyOS实战开发-音视频录制、如何实现音频录制和视频录制功能的应用

介绍 音视频录制应用是基于AVRecorder接口开发的实现音频录制和视频录制功能的应用&#xff0c;音视频录制的主要工作是捕获音频信号&#xff0c;接收视频信号&#xff0c;完成音视频编码并保存到文件中&#xff0c;帮助开发者轻松实现音视频录制功能&#xff0c;包括开始录制…

2024年MCN商业模式运营体系行业发展分析

【干货资料持续更新&#xff0c;以防走丢】 2024年MCN商业模式运营体系行业发展分析 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 mcn运营资料包&#xff08;完整资料包含以下内容&#xff09; 目录 MCN机构运营方案的概要&#xff1a; 一、MCN机构定位与目…

Linux中安装seata

Linux中安装seata 一、准备1、环境2、下载3、上传到服务器4、解压 二、配置1、备份配置文件2、导入sql3、修改配置前4、修改配置后5、在nacos中配置 三、使用1、启动2、关闭 一、准备 1、环境 因为要在 nacos 中配置&#xff0c;要求安装并启动 nacos 。可以参考这篇博客。 …

接口优化技巧

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案 二、接口优化方案总结 1.批处理 批量思想&#xff1a;批量操作数据库&a…

ObjectiveC-第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…

《哈迪斯》自带的Lua解释器是哪个版本?

玩过《哈迪斯》&#xff08;英文名&#xff1a;Hades&#xff09;吗&#xff1f;最近在研究怎么给这款游戏做MOD&#xff0c;想把它的振动体验升级到更高品质的RichTap。N站下载了一些别人做的MOD&#xff0c;发现很多都基于相同的格式&#xff0c;均是对游戏.sjon文件或.lua文…

基于springboot smm vue的物流管理系统

本系统实现一个物流管理系统。具体功能描述如下&#xff1a; 系统其它信息管理&#xff1a;主要是针对系统的其他的信息进行管理&#xff0c;实现了系统的模块化的管理&#xff0c;系统的框架建设等信息的管理&#xff0c;具有系统的整合性功能的建立&#xff0c;支撑起整个系…

Deblurring 3D Gaussian Splatting去模糊3D高斯溅射

Abstract 摘要 Recent studies in Radiance Fields have paved the robust way for novel view synthesis with their photorealistic rendering quality. Nevertheless, they usually employ neural networks and volumetric rendering, which are costly to train and impede…

誉天教育近期开班计划

RHCA374 晚班 2024/4/15 数通HCIP 周末班 2024/4/20 RHCE 周末班 2024/4/20 云计算直通车 周末班 2024/4/20 欧拉HCIE 周末班 2024/4/20 存储HCIE 晚班 2024/4/22 云服务直通车 周末班 2024/4/27 安全HCIE 晚班 2024/5/6 云计算HCIE 晚班 2024/5/6 周末班&a…

一文涵盖Lambda,Stream,响应式编程,从此爱上高效率编程

一文涵盖Lambda,Stream,响应式编程&#xff0c;从此爱上高效率编程 前言 本文结构为 先是一个例子&#xff0c;带你快速体验&#xff0c;之后再去深究里面的方法。以及一些底层原理是如何实现的。从如何用&#xff0c;到如何用好&#xff0c;如何用精。学习操作&#xff0c;学…

代码随想录——二分查找(二)

模版 func binarySearch(nums []int, target int) int {l, r : 0, len(nums)-1for l < r {mid : l (r-l)/2if nums[mid] target {return mid} else if nums[mid] < target {l mid 1} else {r mid}}return -1 }例题 一.第一个错误的版本 代码&#xff1a; func fi…

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…

SpringBoot入门(Hello World 项目)

SpringBoot关键结构 1.2.1 Core Container The Core Container consists of the Core, Beans, Context, and Expression Language modules. The Core and Beans modules provide the fundamental parts of the framework, including the IoC and Dependency Injection featur…

【嵌入式日志调试】嵌入式系统限制打印后使用echo定向到串口节点实现日志输出

背景 系统在启动业务进程时把输出定向到NULL&#xff0c;如./sample > /dev/null&#xff0c;正式版本的系统又是只读系统&#xff0c;不方便开放日志。然后又需要输出日志进行分析问题&#xff0c;系统不支持的情况&#xff0c;只改自己负责的进程实现日志打印 方案 步骤…

书生·浦语大模型实战营之XTuner 微调个人小助手认知

书生浦语大模型实战营之XTuner 微调个人小助手认知 在本节课中讲一步步带领大家体验如何利用 XTuner 完成个人小助手的微调&#xff01; 为了能够让大家更加快速的上手并看到微调前后对比的效果&#xff0c; 用 QLoRA 的方式来微调一个自己的小助手&#xff01; 可以通过下面两…

通过ckeditor组件在vue2中实现上传图片

1&#xff0c;开始实现逻辑前&#xff0c;优先启项目&#xff0c;然后将ckeditor引入&#xff0c;大概如下&#xff1a; 1&#xff0c;npm i ckeditor/ckeditor5-vue2 2&#xff0c;下载sdk&#xff0c;https://ckeditor.com/ckeditor-5/online-builder/#&#xff0c;打开这个地…