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函数进行字符串的输入操作

 

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

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

相关文章

书生大模型实战营6

文章目录 L1——基础岛玩转书生「多模态对话」与「AI搜索」产品MindSearch 开源的 AI 搜索引擎书生浦语 InternLM 开源模型官方的对话类产品书生万象 InternVL 开源的视觉语言模型官方的对话产品在知乎上的提交 L1——基础岛 玩转书生「多模态对话」与「AI搜索」产品 MindSea…

three.js+WebGL踩坑经验合集(6.1):负缩放,负定矩阵和行列式的关系(2D版本)

春节忙完一轮&#xff0c;总算可以继续来写博客了。希望在春节假期结束之前能多更新几篇。 这一篇会偏理论多一点。笔者本没打算在这一系列里面重点讲理论&#xff0c;所以像相机矩阵推导这种网上已经很多优质文章的内容&#xff0c;笔者就一笔带过。 然而关于负缩放&#xf…

Baklib解析内容中台与人工智能技术带来的价值与机遇

内容概要 在数字化转型的浪潮中&#xff0c;内容中台与人工智能技术的结合为企业提供了前所未有的发展机遇。内容中台作为一种新的内容管理和生产模式&#xff0c;通过统一管理和协调各种内容资源&#xff0c;帮助企业更高效地整合内外部数据。而人工智能技术则以其强大的数据…

Learning Vue 读书笔记 Chapter 4

4.1 Vue中的嵌套组件和数据流 我们将嵌套的组件称为子组件&#xff0c;而包含它们的组件则称为它们的父组件。 父组件可以通过 props向子组件传递数据&#xff0c;而子组件则可以通过自定义事件&#xff08;emits&#xff09;向父组件发送事件。 4.1.1 使用Props向子组件传递…

小程序电商运营内容真实性增强策略及开源链动2+1模式AI智能名片S2B2C商城系统源码的应用探索

摘要&#xff1a;随着互联网技术的不断发展&#xff0c;小程序电商已成为现代商业的重要组成部分。然而&#xff0c;如何在竞争激烈的市场中增强小程序内容的真实性&#xff0c;提高用户信任度&#xff0c;成为电商运营者面临的一大挑战。本文首先探讨了通过图片、视频等方式增…

【游戏设计原理】96 - 成就感

成就感是玩家体验的核心&#xff0c;它来自完成一件让自己满意的任务&#xff0c;而这种任务通常需要一定的努力和挑战。游戏设计师的目标是通过合理设计任务&#xff0c;不断为玩家提供成就感&#xff0c;保持他们的参与热情。 ARCS行为模式&#xff08;注意力、关联性、自信…

Linux系统上安装与配置 MySQL( CentOS 7 )

目录 1. 下载并安装 MySQL 官方 Yum Repository 2. 启动 MySQL 并查看运行状态 3. 找到 root 用户的初始密码 4. 修改 root 用户密码 5. 设置允许远程登录 6. 在云服务器配置 MySQL 端口 7. 关闭防火墙 8. 解决密码错误的问题 前言 在 Linux 服务器上安装并配置 MySQL …

读书笔记-《Redis设计与实现》(一)数据结构与对象(下)

各位朋友新年快乐~ 今天我们来继续学习 Redis 。 01 整数集合 当集合仅包含整数值&#xff0c;并且元素数量不多时&#xff0c;Redis 就会采用整数集合来作为集合键的底层实现。 typedef struct intset {// 编码方式uint32_t encoding;// 元素数量uint32_t length;// 数组in…

IP服务模型

1. IP数据报 IP数据报中除了包含需要传输的数据外&#xff0c;还包括目标终端的IP地址和发送终端的IP地址。 数据报通过网络从一台路由器跳到另一台路由器&#xff0c;一路从IP源地址传递到IP目标地址。每个路由器都包含一个转发表&#xff0c;该表告诉它在匹配到特定目标地址…

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一&#xff0e;市场情绪 市场全天冲高回落&#xff0c;深成指、创业板指午后翻绿。大金融板块全天强势&#xff0c;天茂集团…

数据分析系列--④RapidMiner进行关联分析(案例)

一、核心概念 1.项集&#xff08;Itemset&#xff09; 2.规则&#xff08;Rule&#xff09; 3.支持度&#xff08;Support&#xff09; 3.1 支持度的定义 3.2 支持度的意义 3.3 支持度的应用 3.4 支持度的示例 3.5 支持度的调整 3.6 支持度与其他指标的关系 4.置信度&#xff0…

HTB靶场Adminstrator

文章目录 靶机信息域环境初步信息收集与权限验证FTP 登录尝试SMB 枚举尝试WinRM 登录olivia域用户枚举 获取Michael权限BloodHound 提取域信息GenericAll 获取Benjamin权限ForceChangePasswordftp登录benjamin 获取Emily权限pwsafehashcat 获取Ethan权限获取管理员(Administrat…

C语言指针专题三 -- 指针数组

目录 1. 指针数组的核心原理 2. 指针数组与二维数组的区别 3. 编程实例 4. 常见陷阱与防御 5. 总结 1. 指针数组的核心原理 指针数组是一种特殊数组&#xff0c;其所有元素均为指针类型。每个元素存储一个内存地址&#xff0c;可指向不同类型的数据&#xff08;通常指向同…

Spring Boot - 数据库集成06 - 集成ElasticSearch

Spring boot 集成 ElasticSearch 文章目录 Spring boot 集成 ElasticSearch一&#xff1a;前置工作1&#xff1a;项目搭建和依赖导入2&#xff1a;客户端连接相关构建3&#xff1a;实体类相关注解配置说明 二&#xff1a;客户端client相关操作说明1&#xff1a;检索流程1.1&…

深入理解MySQL 的 索引

索引是一种用来快速检索数据的一种结构, 索引使用的好不好关系到对应的数据库性能方面, 这篇文章我们就来详细的介绍一下数据库的索引。 1. 页面的大小: B 树索引是一种 Key-Value 结构&#xff0c;通过 Key 可以快速查找到对应的 Value。B 树索引由根页面&#xff08;Root&am…

vue之pinia组件的使用

1、搭建pinia环境 cnpm i pinia #安装pinia的组件 cnpm i nanoid #唯一id&#xff0c;相当于uuid cnpm install axios #网络请求组件 2、存储读取数据 存储数据 >> Count.ts文件import {defineStore} from piniaexport const useCountStore defineStore(count,{// a…

【MySQL — 数据库增删改查操作】深入解析MySQL的 Update 和 Delete 操作

1. 测试数据 mysql> select* from exam1; ----------------------------------------- | id | name | Chinese | Math | English | ----------------------------------------- | 1 | 唐三藏 | 67.0 | 98.0 | 56.0 | | 2 | 孙悟空 | 87.0 | 78.…

数据结构与算法之二叉树: LeetCode LCP 10. 二叉树任务调度 (Ts版)

二叉树任务调度 https://leetcode.cn/problems/er-cha-shu-ren-wu-diao-du/description/ 描述 任务调度优化是计算机性能优化的关键任务之一。在任务众多时&#xff0c;不同的调度策略可能会得到不同的总体执行时间&#xff0c;因此寻求一个最优的调度方案是非常有必要的 通…

JAVA 接口、抽象类的关系和用处 详细解析

接口 - Java教程 - 廖雪峰的官方网站 一个 抽象类 如果实现了一个接口&#xff0c;可以只选择实现接口中的 部分方法&#xff08;所有的方法都要有&#xff0c;可以一部分已经写具体&#xff0c;另一部分继续保留抽象&#xff09;&#xff0c;原因在于&#xff1a; 抽象类本身…

游戏引擎 Unity - Unity 启动(下载 Unity Editor、生成 Unity Personal Edition 许可证)

Unity Unity 首次发布于 2005 年&#xff0c;属于 Unity Technologies Unity 使用的开发技术有&#xff1a;C# Unity 的适用平台&#xff1a;PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域&#xff1a;开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…