C语言:字符串以及与内存地址的关系
本次教程我们将学习字符串我们已更改密码的例子为一个项目来学习#includestdio.h#includestring.hintmain(){charpassword[20];charpassword1[20];printf(input your password\n);scanf(%s,password);printf(input your password again\n);scanf(%s,password1);if(strcmp(password,password1)0){printf(Your password has been updated.);}else{printf(The passwords do not match.);}}我们将针对这一串代码进行学习charchara[10]123;// 字符串intb123;// 整数char和int一样可以声明变量 char声明的则是字符串chara[30]caito123;这个声明的是a字符串为“caito123”[10]这里和数组十分相似代表这个字符串有10个位置分别是 0 1 2 3 4 5 6 7 … 28 29 三十个位置a ↓ c a i t o 1 2 3 \0 0 ...... ←────────────────→ 字符串 ←────────────── 30个char ──────────────→“caito123” 有 8 个字符再加 \0 刚好九个这个 \0 指终止符规定字符串到这里结束但明确指定了[30]所以整个数组有 30 个 char 空间。这意味着后面还可以继续放东西还有一种chara[]caito123;这里没有指定数组大小编译器会根据字符串自动计算caito123加终止符总共9个字符char a[]所以实际上相当于char a[9] “caito123”;它没有多余空间什么是字符串字符串和数字有什么区别呢我们从内存的角度探讨一下数字是“数值”字符串是“字符序列”。即使字符串看起来是数字它在内存中的含义也完全不同。例如int a 123;你可以把它理解成a ↓ ┌────────────────────┐ │ 123 │ └────────────────────┘假设 int 是 4 字节那么它占4 Bytes在内存里实际存储是一个代表数值 123 的二进制数字1111011再看char a[] “123”;这完全不同。内存是a ↓ ┌─────┬─────┬─────┬─────┐ │ 1 │ 2 │ 3 │ \0│ └─────┴─────┴─────┴─────┘也就是4 Bytes每一个字符占一个 char。按照 ASCII‘1’ → 49‘2’ → 50‘3’ → 51所以内存实际上类似49 50 51 0#include string.h之前我们学习过像这种#开头的是预处理命令像一个工具说明书今天终于学习别的说明书了重点先掌握这些函数 作用 示例 strlen() 获取字符串长度 strlen(a) strcpy() 复制字符串 strcpy(a, b) strncpy() 复制指定数量字符 strncpy(a, b, 5) strcat() 拼接字符串 strcat(a, b) strncat() 拼接指定数量字符 strncat(a, b, 5) strcmp() 比较两个字符串 strcmp(a, b) strncmp() 比较前几个字符 strncmp(a, b, 5) strchr() 查找某个字符 strchr(str, a) strstr() 查找一个字符串 strstr(str, abc)今天我们先只学strncmp()strcmp() 比较后会返回一个整数。它的规定是strcmp(a,b)返回 0 → 两个字符串完全相同 0 → a 小于 b 0 → a 大于 b可以写成strcmp(a, b) 0strcmp(a, b) 0strcmp(a, b) 0%s %d 观察一下开头的代码可以发现scanf(%s,password);和之前学习的有一点不一样password不应该写成password吗这边我将进行详细的解释先记住一句最核心的话%d、%s 是告诉 scanf“输入的数据是什么类型” 是告诉 scanf“数据应该放到哪里”。1. 先看一个整数int age;scanf(“%d”, age);假设 age 的地址是 1002。内存可以简单理解成 地址 内容 1000 [ ] 1001 [ ] 1002 [ ] 1003 [ ]执行scanf(%d,age);可以理解成%d “我准备输入一个整数”age “请把这个整数放到 age 的地址”假设你输入123那么age的1002内存中最终保存了整数 123。2. 为什么 %d 后面需要 因为age代表的是age 里面存的值而age代表age 的地址例如int age 18;可以理解成age 18内存 ┌────────────┐ │ 18 │ └────────────┘ ↑ 地址1002所以age得到18而age得到1002scanf 需要的是地址因为它要修改你的变量。所以scanf(“%d”, age);正确。而scanf(“%d”, age);错误。3. %s 为什么不需要 现在看你的字符串char password[20];scanf(“%s”, password);这里就很容易产生疑问为什么没有 password因为password是一个数组。数组名在这种表达式中会自动转换成数组第一个元素的地址假设 char password[20]; 内存 password ↓ 地址从1000开始 1000 1001 1002 1003 1004 ... ┌────┬────┬────┬────┬────┬───── │ │ │ │ │ │ └────┴────┴────┴────┴────┴───── ↑ password[0]所以password实际上可以理解成password[0]因此scanf(“%s”, password);意思就是%s “我要输入一个字符串”password ↓ “从这个地址开始把字符串放进去”4. 输入 Caito123 会发生什么char password[20];scanf(“%s”, password);输入Caito123内存变成 地址 内容 1000 C 1001 a 1002 i 1003 t 1004 o 1005 1 1006 2 1007 3 1008 \0 1009 ...注意最后‘\0’这是字符串结束符。看到这里我相信你已经可以自己写出一个重新设置密码的简单程序了这个程序仅仅只是一个最简单的逻辑框架实际应用上还要考虑登录身份验证HTTPS/TLS密码强度登录失败次数限制防暴力破解密码哈希与盐会话/Token数据库安全日志中避免泄露密码

相关新闻

打造个性化 CLI 命令检索器:用模糊语义匹配替代繁琐的 man 手册翻阅

打造个性化 CLI 命令检索器:用模糊语义匹配替代繁琐的 man 手册翻阅

长期在终端下作业的工程师,几乎都有过被庞杂的命令行参数折磨的经历。像 tar -czvf 或 ps aux 这种形成肌肉记忆的命令固然不在话下,但面对一些低频却关键的诊断场景时,人类大脑的记忆带宽就显得捉襟见肘。例如:如何在多网卡环境下…

2026/10/8 19:02:46 阅读更多 →
智慧社区养老健康管理系统:Spring Boot+Vue+MySQL实战与避坑

智慧社区养老健康管理系统:Spring Boot+Vue+MySQL实战与避坑

简介:一份基于SpringBootVue的智慧社区居家养老健康管理系统源码,适合计算机、电子信息类专业学生用作毕业设计、课程设计或期末大作业。系统采用B/S架构和MVC分层,围绕MySQL、MyBatis、Ajax、ElementUI等技术栈实现,覆盖用户信息…

2026/10/9 20:44:51 阅读更多 →
Superpowers技能包:让Claude Code按工程方法论自动推进任务

Superpowers技能包:让Claude Code按工程方法论自动推进任务

你有没有遇到过这种情况:装了 Cluade Code,却总觉得它只是一个听话的聊天机器人——让它写个函数、改个 bug 没问题,但遇到"帮我把整个项目梳理一遍然后出一个重构方案"这种任务时,它就变得有点平庸,给出的结…

2026/10/8 19:02:46 阅读更多 →

最新新闻

t3code:第三代代码规范工程化实践,一条命令统一质量检查

t3code:第三代代码规范工程化实践,一条命令统一质量检查

写代码这行当,干得越久越觉得,真正折磨人的不是写业务逻辑,而是“让一群人长期稳定地把代码写规范”。我前前后后折腾过格式化工具、静态检查、复杂度检测、提交信息校验,每一样单独拎出来都挺好用,但凑在一起就是一团…

2026/10/9 20:44:13 阅读更多 →
基于Neo4j社交兴趣推荐系统:图模型设计与Cypher源码拆解

基于Neo4j社交兴趣推荐系统:图模型设计与Cypher源码拆解

简介:这份源码资源面向希望掌握图数据库应用开发与推荐系统设计的学习者,以Neo4j为核心数据库,构建了一套社交兴趣推荐系统。系统围绕用户、兴趣及社交关系三类数据元素展开,通过节点与关系建模形成社交网络图,并结合协…

2026/10/9 20:44:13 阅读更多 →
软件测试面试官视角:从背题到讲透原理的实战指南

软件测试面试官视角:从背题到讲透原理的实战指南

做了这么多年软件测试,自己也从被面试的人变成了坐在桌子对面提问的人,说实话,每次看到“全网最全软件测试面试题”这种标题,我第一反应是:又有人要收割收藏了。但转念一想,能花时间整理这类资源的人&#…

2026/10/9 20:44:13 阅读更多 →
技术周榜深度拆解:开发工具、AI与前端项目的选型逻辑与避坑指南

技术周榜深度拆解:开发工具、AI与前端项目的选型逻辑与避坑指南

1. 周榜数据背后的信号:为什么值得花时间逐项拆解每周刷一次热榜的人很多,但真正把榜单当成"技术风向标"来读的人很少。大多数人扫一眼项目名,看到几个眼熟的词,点进去瞄两眼 README,然后关掉页面&#xff0…

2026/10/9 20:43:12 阅读更多 →
Codex 插件实战:12 个提升 AI 编程效率的必备工具

Codex 插件实战:12 个提升 AI 编程效率的必备工具

用 Codex 写代码这件事,我最深的体会是:它本身确实聪明,但真正决定效率上限的,往往不是它生成代码的能力,而是它对你的项目了解多少。我接手过一个老项目,目录结构乱、依赖多、历史包袱重,每次让…

2026/10/9 20:43:12 阅读更多 →
机器视觉镜头选型指南:从焦距计算到现场验收的工程实践

机器视觉镜头选型指南:从焦距计算到现场验收的工程实践

简介:这份PPT学习教案面向机器视觉入门者、自动化检测工程师及相关专业师生,系统讲解镜头这一视觉系统核心部件。内容从图像质量参数切入,剖析分辨率、对比度、景深与畸变对成像的影响,并延伸至光心、主轴、焦点、焦平面、共轭关系…

2026/10/9 20:43:12 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →