sizeof和strlen的对比与一些杂记

1.sizeof和strlen的对比

1.1sizeof

(1)sizeof是一种操作符

(2)sizeof计算的是类型或变量所占空间的大小,单位是字节

注意事项:

(1)sizeof 返回的值类型是 size_t,这是一个无符号整数类型

格式控制符为: %zu

(2)sizeof中的表达式并不会计算

如上图:如果计算,c应该等于1才对

虽然a、b都是int型,占4个字节

但最终是赋值给c,c是short型,只占2个字节

所以sizeof计算的是short类型的大小

(2.1)不计算的原因:

(2.1.1)sizeof在编译时进行计算,而不是在运行时

编译器会根据表达式的类型来确定其大小,而不是实际去计算表达式的值。

(2.1.2)这种设计避免了运算,可以提高程序的效率

 1.2strlen

strlen 是c语言库函数,功能是求字符串的长度

 

(1)传入的参数是一个指向字符串首字符的指针

这个指针实际上是

指向整个字符串起始位置的地址

(2)返回值是

从字符串的起始位置到第一个空字符('\0')之前的字符数量,但不包括空字符本身

注意事项:

(1)使用时包含头文件<string.h>

(2)所求字符串必须以空字符结尾,否则返回的是随机值

改进

总结:

2.\0与0的区别

(1)\0,是一个字符常量,表示空字符

在ASCII码表中,\0 的值是0

\0是一个字符类型的值,通常用于表示字符串的结束

(2)类型是char或unsigned char

(1)0,是一个整数常量,表示数值0

(2)0 的类型可以是任何整数类型,如intshortlong

具体取决于上下文和编译器如何处理字面量

3.数组元素的默认值

在C语言中,以下几种情况下的数组元素会被初始化为0

一、全局数组或静态数组

(1)在所有函数外部定义的全局数组如果未被显式初始化,则根据C99标准及其后的版本数组元素会被隐式初始化为0

(2)静态数组如果未被显式初始化,则通常会被初始化为0

二、部分初始化的数组

当数组被部分初始化时,未初始化的元素会被自动填充为0

三、使用特定函数初始化的数组

calloc函数在分配内存的同时会将内存中的所有字节都初始化为0

4.函数参数的传递顺序

(1)函数参数的传递顺序是从右到左

即,最右边的参数最先被压入栈中,而最左边的参数最后被压入栈中

(2)C语言标准并没有严格规定参数的求值顺序

所以在编写C语言代码时,

应该避免依赖于特定的传参顺序或参数求值顺序

5.格式控制说明符

格式控制说明符描述示例
%d 或 %i输出有符号十进制整数printf("%d", 123); 输出 123
%u输出无符号十进制整数printf("%u", 456U); 输出 456
%o输出无符号八进制整数printf("%o", 0123); 输出 123(八进制)
%x 或 %X输出无符号十六进制整数printf("%x", 0xABC); 输出 abc(小写)<br>printf("%X", 0xABC); 输出 ABC(大写)
%f输出十进制浮点数printf("%f", 3.14159); 输出 3.141590(默认6位小数)
%e 或 %E输出科学计数法形式的浮点数printf("%e", 3.14159); 输出 3.141590e+00<br>printf("%E", 3.14159); 输出 3.141590E+00
%g 或 %G自动选择%f%e/%E格式输出浮点数printf("%g", 123456.789); 可能输出 123456.789<br>printf("%G", 1.23456789e-10); 可能输出 1.234568E-10
%c输出单个字符printf("%c", 'A'); 输出 A
%s输出字符串printf("%s", "Hello, World!"); 输出 Hello, World!
%p输出指针的地址printf("%p", (void*)&var); 输出变量var的地址
%%输出百分号字符printf("%%"); 输出 %

字段宽度和精度的示例:

格式控制说明符描述示例
%5d输出至少5个字符宽度的整数,右对齐,不足部分填充空格printf("%5d", 42); 输出 42(前面有3个空格)
%-5d输出至少5个字符宽度的整数,左对齐,不足部分填充空格printf("%-5d", 42); 输出 42 (后面有3个空格)
%05d输出至少5个字符宽度的整数,右对齐,不足部分用零填充printf("%05d", 42); 输出 00042
%.2f输出浮点数,保留两位小数printf("%.2f", 3.14159); 输出 3.14
%6.2f输出浮点数,总宽度至少6个字符,保留两位小数,右对齐printf("%6.2f", 3.14); 输出 3.14(前面有2个空格)

对齐标志的示例(注意:对齐标志通常与字段宽度一起使用):

格式控制说明符描述示例
%-d左对齐整数输出printf("%-5d", 42); 输出 42 (左对齐,后面有3个空格)
%+d在整数前面显示正号或负号printf("%+d", 42); 输出 +42<br>printf("%+d", -42); 输出 -42
% d(空格与%之间有一个空格)在正整数前面显示空格,在负整数前面显示负号printf("% d", 42); 输出 42(前面有一个空格)<br>printf("% d, -42); 输出 -42

                                                                                       ---来源:文心一言

6.字符串的输入与输出

一、字符串输入

(1)scanf

使用%s读取字符串,直到遇到空白字符(空格、制表符、换行符)

注意避免缓冲区溢出,可指定宽度如%99s

示例:char str[100]; scanf("%99s", str);

(2)fgets:

从指定流(如stdin)读取最多n-1个字符或直到遇到换行符,

并在字符串末尾自动添加\0

换行符也会被读取并存储在字符串中(除非流已到达文件末尾)

示例:char str[100]; fgets(str, sizeof(str), stdin);

二、字符串输出

(1)printf:

使用%s输出字符串,直到遇到字符串末尾的\0

示例:char str[] = "Hello, World!"; printf("%s\n", str);

(2)puts:

输出字符串,

直到遇到字符串末尾的\0,并在末尾自动添加换行符

不接受格式说明符

示例:char str[] = "Hello, World!"; puts(str);

总结:

(1)使用scanf输入字符串时,务必指定宽度以限制读取的字符数,防止缓冲区溢出。

(2)fgets会读取并存储换行符(如果输入中包含)

如果不希望换行符出现在字符串中,可以手动去除。

(3)在处理字符串时,始终要注意字符串的长度和存储它的数组的容量,以避免缓冲区溢出等安全问题。

7.变长数组

变长数组是C99标准之后引入的一个特性

它允许数组的长度运行时确定,而不是再编译时

即:

在声明变长数组

数组的大小可以是一个变量或者是一个表达式的结果

这个变量或表达式的值在运行时才会确定

注意事项:

(1)变长数组不能在声明时初始化

因为变长数组的长度在编译时是不确定的

无法在编译时进行初始化

(2)变长数组的大小在程序运行期间是保持不变的

”仅指在创建数组时可以使用变量指定数组长度

而非在数组创建后改变其大小

8.关于gets

gets函数在C11标准中被标记为过时,不推荐使用

这是因为:

如果用户输入的字符串长度超过了数组能够容纳的长度

gets函数会继续将字符写入数组

直到遇到换行符(\n)或文件结束符(EOF)

导致

缓冲区溢出

可能覆盖内存中的其他数据

引发未定义行为,如程序崩溃、数据损坏或安全漏洞(如栈溢出攻击)

所以

多使用fgets和scanf函数进行字符串的输入操作

 

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

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

相关文章

实测数据处理(Wk算法处理)——SAR成像算法系列(十二)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《wk算法-SAR成像算法系列&#xff08;五&#xff09;》 文章目录 前言 一、算法流程 1.1、回波信号生成 2.2 Stolt插值 2.3 距离脉冲压缩 2.4 方位脉冲压缩 2.5 SAR成像 二、仿真实验 2.1、仿真参数…

FFmpeg rtmp推流直播

文章目录 rtmp协议RTMP协议组成RTMP的握手过程RTMP流的创建RTMP消息格式Chunking(Message 分块) rtmp服务器搭建Nginx服务器配置Nginx服务器 librtmp库编译推流 rtmp协议 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是由Adobe公司基于Flash Player播放器对应的…

docker搭建redis集群(三主三从)

本篇文章不包含理论解释&#xff0c;直接开始集群&#xff08;三主三从&#xff09;搭建 环境 centos7 docker 26.1.4 redis latest &#xff08;7.4.2&#xff09; 服务器搭建以及环境配置 请查看本系列前几篇博客 默认已搭建好三个虚拟机并安装配置好docker 相关博客&#xf…

接口使用实例(2)

大家好&#xff0c;今天我们来解答一下昨天留下的一个问题&#xff0c;并且继续来看一些接口使用实例。 通过String类中重写的方法compareTo来实现我们的比较name的需求&#xff1a; 2,用Comparator接口来实现类的比较(比较器) 了解即可&#xff0c;以后会详细讲。 知识点:C…

基于Springboot的社区药房管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

vue框架技术相关概述以及前端框架整合

vue框架技术概述及前端框架整合 1 node.js 介绍&#xff1a;什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎。 作用 1 运行java需要安装JDK&#xff0c;而Node.js是JavaScript的运行环…

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…

密码强度验证代码解析:C语言实现与细节剖析

在日常的应用开发中&#xff0c;密码强度验证是保障用户账户安全的重要环节。今天&#xff0c;我们就来深入分析一段用C语言编写的密码强度验证代码&#xff0c;看看它是如何实现对密码强度的多维度检测的。 代码整体结构 这段C语言代码主要实现了对输入密码的一系列规则验证&a…

蓝桥杯模拟算法:多项式输出

P1067 [NOIP2009 普及组] 多项式输出 - 洛谷 | 计算机科学教育新生态 这道题是一道模拟题&#xff0c;我们需要分情况讨论&#xff0c;我们需要做一下分类讨论 #include <iostream> #include <cstdlib> using namespace std;int main() {int n;cin >> n;for…

Pytorch框架从入门到精通

目录 一、Tensors 1.1 初始化一个Tensor 1&#xff09;赋值初始化 2&#xff09;从 NumPy 数组初始化 3&#xff09;从另一个张量 4&#xff09;使用随机值或常量值 1.2 Tensor 的属性 1.3 对 Tensor 的操作 1.3.1 总体介绍 1.3.2 索引和切片 1.3.3 算术运算 矩阵乘…

2024年数据记录

笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统&#xff0c;笔者原力值超过99.99%的用户 其他年度数据

【已解决】黑马点评项目Redis版本替换过程的数据迁移

黑马点评项目Redis版本替换过程的数据迁移 【哭哭哭】附近商户中需要用到的GEO功能只在Redis 6.2以上版本生效 如果用的是老版本&#xff0c;美食/KTV的主页能正常返回&#xff0c;但无法显示内容 上次好不容易升到了5.0以上版本&#xff0c;现在又用不了了 Redis 6.2的windo…

Win11下帝国时代2无法启动解决方法

鼠标右键点图标&#xff0c;选择属性 点开始&#xff0c;输入启用和关闭

android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色

安卓自定义DatePicker选中日期颜色 背景&#xff1a;解决方案&#xff1a;方案一&#xff1a;方案二&#xff1a;实践效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中的的选择日期涉及到安卓DatePicker组件的使用&#…

SpringBoot 基础(Spring)

SpringBoot 基础&#xff08;Spring) Bean 注解标记和扫描 (IoC) 配置类概念 SpringBootConfiguration 或者 Configuration 注解标注的类就是配置类配置类本身也会加入 IoC 容器* Configuration public class configuration1 {}SpringBootConfiguration public class configur…

【数据结构与算法】九大排序算法实现详解

文章目录 Ⅰ. 排序的概念及其运用一、排序的概念二、常见的排序算法三、排序算法的接口四、测试算法接口附&#xff1a;Swap接口&#xff08;使用异或的方法实现&#xff09; Ⅱ. 排序算法的实现一、插入排序二、希尔排序( 缩小增量排序 )三、选择排序四、堆排序五、冒泡排序六…

Ansys Maxwell:采用对称性的双转子轴向磁通电机

轴向磁通电机因其功率密度高于相同重量的传统径向磁通电机而变得非常受欢迎&#xff0c;并且在电动汽车和航空应用中非常高效且具有成本效益。功率密度是输出功率与机器体积的比率。对于给定尺寸的机器&#xff0c;轴向磁通电机提供更大的扭矩和功率&#xff0c;或者对于给定的…

Leetcode:219

1&#xff0c;题目 2&#xff0c;思路 第一种就是简单的暴力比对当时过年没细想 第二种&#xff1a; 用Map的特性key唯一&#xff0c;把数组的值作为Map的key值我们每加载一个元素都会去判断这个元素在Map里面存在与否如果存在进行第二个判断条件abs(i-j)<k,条件 符合直接…

Hugging Face挑战DeepSeek,AI开源竞赛升级!

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.27 线性代数王国:矩阵分解实战指南

1.27 线性代数王国&#xff1a;矩阵分解实战指南 #mermaid-svg-JWrp2JAP9qkdS2A7 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JWrp2JAP9qkdS2A7 .error-icon{fill:#552222;}#mermaid-svg-JWrp2JAP9qkdS2A7 .erro…