16. C语言 字符串详解
本章目录:
- 前言
- C 字符串的基础概念
- 字符串的定义
- 字符串的内存表示
- 常见的字符串操作函数
- 示例代码
- 深入探讨字符串长度计算
- `strlen` 与 `sizeof` 的区别
- 字符串操作的注意事项
- **1. 字符数组的大小**
- 2. 字符数组和字符指针的区别
- 3. 使用安全函数
- 字符串的遍历与格式化输出
- **遍历字符串**
- 格式化输出
- 总结
前言
在 C 语言中,字符串是一种特殊的数据类型,它实际上是以空字符 \0 结尾的一维字符数组。本文将从基本概念、常见函数使用、字符数组与字符指针的区别等多个角度深入探讨 C 语言字符串操作,帮助开发者更高效地掌握这一核心内容。
C 字符串的基础概念
字符串的定义
- 字符串的本质:以空字符
\0结束的字符数组。 - 字符串字面量:例如
"hello world"是常量,在编译时会自动添加\0。
###字符串初始化
C 提供了两种主要方式初始化字符串:
- 字符数组:
char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'}; char site[] = "RUNOOB"; // 编译器自动添加 \0 - 字符指针:
char *greeting = "Hello";
注意:使用字符指针时,字符串内容存储在只读存储区,不能直接修改。
字符串的内存表示
字符串存储在内存中时,每个字符占据一个字节,末尾以 \0 标志结束。
常见的字符串操作函数
C 标准库 <string.h> 提供了一系列用于操作字符串的函数:
| 函数 | 描述 |
|---|---|
strcpy(s1, s2) | 将字符串 s2 复制到 s1。 |
strcat(s1, s2) | 将字符串 s2 连接到 s1 的末尾。 |
strlen(s1) | 返回字符串 s1 的长度(不包括 \0)。 |
strcmp(s1, s2) | 比较字符串 s1 和 s2,返回值根据大小关系为 0、正值或负值。 |
strchr(s1, ch) | 返回指向字符串 s1 中字符 ch 第一次出现位置的指针。 |
strstr(s1, s2) | 返回指向字符串 s1 中子串 s2 第一次出现位置的指针。 |
示例代码
以下代码演示了这些函数的基本使用:
#include <stdio.h>
#include <string.h>int main() {char str1[20] = "Hello";char str2[] = "World";char str3[20];int len;// 复制字符串strcpy(str3, str1);printf("strcpy(str3, str1): %s\n", str3);// 连接字符串strcat(str1, str2);printf("strcat(str1, str2): %s\n", str1);// 计算字符串长度len = strlen(str1);printf("strlen(str1): %d\n", len);return 0;
}
输出结果:
strcpy(str3, str1): Hello
strcat(str1, str2): HelloWorld
strlen(str1): 10
深入探讨字符串长度计算
strlen 与 sizeof 的区别
| 功能 | strlen | sizeof |
|---|---|---|
| 计算内容 | 字符串的实际长度(不包括 \0)。 | 字符数组的大小(包括 \0)。 |
| 作用范围 | 仅适用于字符串。 | 可用于任何类型的变量和数据结构。 |
| 计算方式 | 遍历字符串,遇到 \0 时停止计数。 | 在编译时直接得出分配的内存大小。 |
示例:
#include <stdio.h>
#include <string.h>void demo() {char s[] = "hello, world!";printf("sizeof(s): %lu\n", sizeof(s)); // 包括 '\0'printf("strlen(s): %lu\n", strlen(s)); // 不包括 '\0'
}int main() {demo();return 0;
}
输出:
sizeof(s): 14
strlen(s): 13
字符串操作的注意事项
1. 字符数组的大小
在明确指定字符数组大小时,请务必为 \0 预留空间:
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
如果未包含 \0:
char greeting[5] = {'H', 'e', 'l', 'l', 'o'};
printf("%s\n", greeting); // 可能导致未定义行为
2. 字符数组和字符指针的区别
- 字符数组:可修改内容;声明后占用固定内存。
- 字符指针:内容存储在只读存储区,尝试修改会导致运行错误。
3. 使用安全函数
在 MSVC 编译器中,推荐使用安全函数 strcpy_s 和 strcat_s,这些函数多了一个缓冲区大小参数,可以避免缓冲区溢出问题:
#include <stdio.h>
#include <string.h>int main() {char dest[50];strcpy_s(dest, sizeof(dest), "Hello");strcat_s(dest, sizeof(dest), ", Secure World!");printf("%s\n", dest);return 0;
}
字符串的遍历与格式化输出
遍历字符串
char str[] = "Hello";
for (int i = 0; str[i] != '\0'; i++) {printf("%c ", str[i]);
}
格式化输出
%s用于输出字符串:printf("Greeting: %s\n", str);
总结
- 字符串的本质是以
\0结束的字符数组。 - 熟练掌握字符串操作函数,如
strcpy、strcat、strlen。 - 注意
strlen与sizeof的区别。 - 使用安全函数(如
strcpy_s)确保代码的安全性。
通过灵活运用 C 语言中的字符串操作,开发者可以高效地处理文本数据,提高代码的健壮性和安全性。
相关文章:
16. C语言 字符串详解
本章目录: 前言C 字符串的基础概念字符串的定义字符串的内存表示 常见的字符串操作函数示例代码 深入探讨字符串长度计算strlen 与 sizeof 的区别 字符串操作的注意事项**1. 字符数组的大小**2. 字符数组和字符指针的区别3. 使用安全函数 字符串的遍历与格式化输出**遍历字符串…...
使用Buildroot开始嵌入式Linux系统之旅-3
文章目录 at91bootstrap操作教程修改at91bootstrap具体配置重新编译at91bootstrap U-Boot操作教程修改U-Boot具体配置重新编译U-Boot Linux Kernel操作教程修改Linux Kernel具体配置重新编译Linux Kernel buildroot操作进阶生成图形化软件模块依赖关系查看具体软件模块依赖关系…...
[免费]SpringBoot+Vue新能源汽车充电桩管理系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue新能源汽车充电桩管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue新能源汽车充电桩管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息化时代的到来࿰…...
【已解决】【记录】2AI大模型web UI使用tips 本地
docker desktop使用 互动 如果需要发送网页链接,就在链接上加上【#】号 如果要上传文件就点击这个➕号 中文回复 命令它只用中文回复,在右上角打开【对话高级设置】 输入提示词(提示词使用英文会更好) Must reply to the us…...
44.ComboBox的数据绑定 C#例子 WPF例子
固定最简步骤,包括 XAML: 题头里引入命名空间 标题下面引入类 combobox绑定资源属性和选择属性,block则绑定和combobox一样的选择属性 C#: 通知的类,及对应固定的任务 引入字段 引入属性 其中资源是只读的 选…...
物联网之传感器技术
引言 在数字化浪潮席卷全球的今天,物联网(IoT)已成为推动各行各业变革的重要力量。而物联网传感器,作为物联网感知层的核心技术,更是扮演着不可或缺的角色。它们如同人类的五官,能够感知物理世界中的各种信…...
QTreeWidget QTreeWidgetItem
QTreeWidgetItem 是 Qt 框架中用于在 QTreeWidget 中表示树形结构中每个节点的类。它是 QTreeWidget 的一部分,允许您创建和管理层次结构的数据展示。 QTreeWidgetItem 用于表示树形结构中的单个节点。 添加子节点: 可以通过 addChild() 方法向节点添加…...
torch.einsum计算张量的外积
torch.einsum 是一种强大的张量操作工具,可以通过爱因斯坦求和约定(Einstein summation convention)来简洁地表示复杂的张量运算。通过它,我们可以高效地计算矩阵乘法、转置、点积、外积等操作。 以下是关于如何使用 torch.einsum 计算两个四维张量在第三维度上的外积的解…...
PostgreSQL 超级管理员详解
1. 什么是 PostgreSQL 超级管理员 PostgreSQL 超级管理员(superuser)是拥有数据库系统最高权限的用户。他们可以执行任何数据库操作,包括但不限于创建和删除数据库、用户、表空间、模式等。超级管理员权限是 PostgreSQL 中权限的最高级别。 …...
RabbitMQ 工作模式使用案例之(发布订阅模式、路由模式、通配符模式)
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:RabbitMQ 📚本系列文章为个人学…...
【2024年华为OD机试】(C卷,100分)- 机场航班调度程序 (Java JS PythonC/C++)
一、问题描述 题目描述 XX市机场停放了多架飞机,每架飞机都有自己的航班号,如CA3385,CZ6678,SC6508等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息…...
Vue.js组件开发-使用地图绘制轨迹
在Vue.js中开发一个组件来展示地图并绘制轨迹,可以使用诸如Leaflet.js、Mapbox GL JS或百度地图等地图库。这些库提供了丰富的API来创建和定制地图,以及绘制路径、标记和其他地图元素。 示例: 1. 安装Leaflet.js 首先,需要安装…...
vue 与 vue-json-viewer 实现 JSON 数据可视化
前言 接口的调试和测试是确保系统稳定性的重要步骤。为了让开发人员和测试人员能够直观地查看接口返回的 JSON 数据,使用合适的工具至关重要。vue-json-viewer 插件为 vue 开发者提供了一个简单而强大的解决方案。本文将详细介绍如何在 vue 项目中使用该插件&#x…...
ubuntu Android : adb logcat 过滤多个log
指定字符串的log,可以用下面的形式,注意加-E和单引号: adb shell " logcat | grep -E strings1|strings2 " 参考:Android : adb logcat 过滤多个log 用adb shell “ logcat | grep -E ‘strings1| strings2 ‘ “ 形…...
kubeneters-循序渐进Cilium网络(三)
文章目录 概要命名空间之间的路由同一节点上的 Pod 到 Pod 路由跨节点的 Pod 间路由总结 概要 在前一篇讨论网络接口的内容中,详细分析了如何识别所有参与 Pod 间路由的接口。同时,以简明的非技术语言阐述了 Cilium 在 Kubernetes 集群中的路由机制。接…...
编译与汇编
本文来自《程序员的自我修养》 编译过程是把预处理完的文件进行一系列词法分析,语法分析,语义分析以及优化后生成相应的汇编文件代码。 现在版本的GCC把预编译和编译两个步骤合并为一个步骤。 gcc -S HelloWorld.c HelloWorld.sint main() {//test/* …...
对MySQL滴MVCC理解(超详细)
学习目标 什么是MVCC?MVCC的核心概念MVCC 的工作原理MVCC 的优势MVCC 的劣势 什么是MySQL中InnoDB下滴快照读和当前读?一、快照读(Snapshot Read)二、当前读(Current Read)三、快照读和当前读的区别四、当前…...
Mac玩Steam游戏秘籍!
Mac玩Steam游戏秘籍! 大家好!最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心,我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏,简单又实用! 第一步:下载Crossover 首先&…...
matlab实现了一个优化的遗传算法,用于求解注汽站最优位置的问题
function [best_chromosome, best_fitness] optimized_genetic_algorithm()%% 遗传算法参数初始化% 定义井信息,包括坐标、管道长度、流量、压力等wells defineWells(); % 返回井的结构体数组N length(wells); % 注汽井数量% 遗传算法相关参数L_chromosome 20; …...
电商项目-基于ElasticSearch实现商品搜索功能(三)
本系列文章主要介绍基于 Spring Data Elasticsearch 实现商品搜索的后端代码,介绍代码逻辑和代码实现。 主要实现功能:根据搜索关键字查询、条件筛选、规格过滤、价格区间搜索、搜索查询分页、搜索查询排序、高亮查询。 主要应用技术:canal,…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...
