当前位置: 首页 > news >正文

字符串与数组

字符串一般是用字符数组的方式存储,如:char str[]="123456";

这里str是一个字符数组,它存放了一个字符串“123456”,由于字符串还有一个结束符“\0”,所以此数组的长度为7而不是6.

strcpy函数与memcpy函数:

strcpy函数与memcpy都是标致C库函数,他们有下面的特点:

strcpy:提供了字符串的复制,只用于字符串的复制,并且它不仅复制字符串的内容,还会复制字符串的结束符。

memcpy:提供了一般内存的复制,对于要复制的内容,没有限制,因此用途更广。

不调用库函数实现strcpy函数

#include<stdio.h> char * strcpy(char *strDest,const char * strSrc) { if((strDest==NULL)||(strSrc==NULL)) { return NULL; } char *start = strDest; while(*strSrc!='\0') { *strDest=*strSrc; strDest++; strSrc++; } *strDest = '\0'; return (start); } int main() { char buf[100]; strcpy(buf, "hello c"); printf("%s\n", buf); return 0; }

进一步简化,赋值、拷贝\0、指针自增、判断循环终止合并

#include<stdio.h> char * strcpy(char *strDest,const char * strSrc) { if((strDest==NULL)||(strSrc==NULL)) { return NULL; } char *start = strDest; while (*strDest++ = *strSrc++); return (start); } int main() { char buf[100]; strcpy(buf, "hello c"); printf("%s\n", buf); return 0; }

实现计算字符串的长度

#include <stdio.h> // 返回字符串长度,失败返回0 int GetStrLen(const char* strSrc) { // 空指针保护 if (strSrc == NULL) { return 0; } int len = 0; // 没读到结束符就计数 while (*strSrc != '\0') { len++; strSrc++; } return len; } int main(void) { char str[] = "abc123"; printf("长度:%d\n", GetStrLen(str)); // 输出6 printf("空串长度:%d\n", GetStrLen("")); // 输出0 printf("空指针:%d\n", GetStrLen(NULL)); // 输出0 return 0; }

方法2:

int GetStrLen(const char* strSrc) { if (strSrc == NULL) return 0; const char* p = strSrc; while (*p) // *p != '\0'简写 p++; // 指针相减得到字符个数 return p - strSrc; }

原理:

  1. p从头走到\0的位置
  2. 末尾指针 - 起始指针 = 中间有效字符数量

核心逻辑拆解

  1. 判空:防止传入NULL解引用崩溃
  2. 循环条件:*strSrc != '\0',只要不是结束符说明还有有效字符
  3. 两种计数思路:
    • 变量累加计数器len++
    • 指针偏移后做差值运算(无额外变量,更高效)
http://www.cnnetsun.cn/news/3121939.html

相关文章:

  • openeuler/krun安装与部署完全指南:从源码编译到RPM打包的完整流程
  • 构建健壮的GPG密钥体系:主密钥与子密钥分离架构实战指南
  • 困难任务推进不动时,我用0.1%最小成功法自救
  • 终极指南:如何用SecGPT网络安全大模型提升你的安全防御能力
  • Dynamsoft_Barcode_Reader_Python 11.4.3000
  • BiSheng JDK 21模块化系统深度解析:Java模块化架构最佳实践
  • 超节点应用场景及技术演进 — 阅读笔记
  • 452. Java 正则表达式 - 文本替换
  • NBTExplorer:5分钟快速上手Minecraft数据编辑的终极免费工具
  • Claude Code CLI 接入 DeepSeek 实战指南:零GUI、低延迟AI编程工作流
  • InvenTree开源库存管理系统终极指南:从零开始构建高效零件管理平台
  • NoFences:开源免费的Windows桌面栅栏工具,终结桌面混乱时代
  • Karukan:基于神经网络的日语输入系统,实现实时、上下文感知的高级日语转换
  • 【HarmonyOS 7开发者前瞻】01 HarmonyOS 7 开发者适配路线图:从 API 26 Beta 到 Skill、Agent 与 AI 工具链
  • AI 搜索工具烹饪查询结果直链原始食谱,却因 AI 生成食谱问题遭部分美食作家不满
  • 佳能G6080报错5b00维修历程,开始把打印机抱到维修店,维修师傅说修好大概180元,我觉得实在太贵了就没有必要维修了,买一台新的算了,准备买新的时候朋友推荐用佳能V6.200佳能清零软件,最终修好
  • 中小音乐团队版权方案,知保链低成本电子存证批量登记音频
  • PostgresSQL服务部署
  • Oura Ring 5:轻薄升级 40%、续航增一天,软件实用亮点多!
  • 保研每周的具体复习计划
  • 多分类逻辑回归特征选择:最优子集与逐步回归实战指南
  • SpringBoot+Vue 西安工商学院课表管理系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 微型NLP实践闭环:本地化年度复盘工具设计与实现
  • AI制作:2行3列六格分镜复古手账漫画
  • 柔性制造技术升级:从批量生产到个性化定制,重构制造业生产底层模式
  • 5步掌握Topit:Mac窗口置顶神器,告别窗口遮挡烦恼
  • Three.js 粒子泡泡教程
  • 01-GitHub基础认识
  • ROS 2 的发布/订阅通信验证
  • 二维码批量扫码设备硬件选型与并行解码技术方案研究