c语言 --- 字符串
创建字符串
1. 使用字符数组创建字符串
#include <stdio.h>int main() {char str[20] = "Hello, world!";str[0] = 'h'; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0;
}
解释:
- 数组大小
20
表示可以存储 20 个字符(包括末尾的\0
)。 - 初始化时,编译器会自动在字符串末尾添加空字符
'\0'
。
2. 直接初始化字符串常量
#include <stdio.h>int main() {char *str = "Hello, world!"; // 指针指向字符串常量printf("%s\n", str);return 0;
}
解释:
char *str
指向的是字符串常量,字符串常量在内存中的只读区域(通常为代码段)存储。- 通过指针的方式无法修改字符串内容(试图修改会导致未定义行为)。
3. 动态分配内存创建字符串
#include <stdio.h>
#include <stdlib.h>int main() {char *str = (char *)malloc(20 * sizeof(char)); // 动态分配内存if (str == NULL) {printf("内存分配失败\n");return 1;}// 初始化字符串for (int i = 0; i < 5; i++) {str[i] = 'A' + i; // 分别赋值 A, B, C, D, E}str[5] = '\0'; // 添加结束符printf("%s\n", str); // 输出:ABCDEstr[0] = 'Z'; // 修改第一个字符printf("%s\n", str); // 输出:ZBCDEfree(str); // 释放内存return 0;
}
解释:
malloc
动态分配内存,适合字符串长度在运行时不确定的场景。- 使用完动态分配的内存后,记得调用
free
释放内存。
4. 手动逐个字符赋值的数组
#include <stdio.h>int main() {char str[6];str[0] = 'H';str[1] = 'e';str[2] = 'l';str[3] = 'l';str[4] = 'o';str[5] = '\0';str[0] = 'h'; // 修改第一个字符printf("%s\n", str); // 输出:helloreturn 0;
}
总结
创建方式 | 存储位置 | 是否可修改内容 |
---|---|---|
字符数组(如 char str[] ) | 栈内存 | 可以 |
指向字符串常量的指针(如 char * ) | 只读内存 | 不可以(未定义行为) |
动态分配的字符串(如 malloc ) | 堆内存 | 可以 |
逐个字符赋值的数组 | 栈内存 | 可以 |
c语言中常用的处理字符串的函数
1. 字符串复制
strcpy()
- 功能:将一个字符串复制到另一个字符串中。
- 原型:
char *strcpy(char *dest, const char *src);
- 示例:
char dest[20];
char src[] = "Hello";
strcpy(dest, src);
printf("Copied string: %s\n", dest); // 输出:Copied string: Hello
注意:目标字符串 dest
必须足够大,以容纳源字符串和末尾的 '\0'
。
strncpy()
- 功能:复制字符串,但限制复制的最大长度。
- 原型:
char *strncpy(char *dest, const char *src, size_t n);
- 示例:
char dest[10];
char src[] = "HelloWorld";
strncpy(dest, src, 5);
dest[5] = '\0'; // 确保手动添加 '\0'
printf("Partial copy: %s\n", dest); // 输出:Partial copy: Hello
2. 字符串拼接
strcat()
- 功能:将源字符串拼接到目标字符串的末尾。
- 原型:
char *strcat(char *dest, const char *src);
- 示例:
char dest[20] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("Concatenated string: %s\n", dest); // 输出:Concatenated string: Hello, World!
strncat()
- 功能:拼接字符串,但限制拼接的最大长度。
- 原型:
char *strncat(char *dest, const char *src, size_t n);
- 示例:
char dest[20] = "Hello, ";
char src[] = "World!";
strncat(dest, src, 3);
printf("Partially concatenated string: %s\n", dest); // 输出:Partially concatenated string: Hello, Wor
3. 字符串长度
strlen()
- 功能:获取字符串的长度(不包括
'\0'
)。 - 原型:
size_t strlen(const char *str);
- 示例:
char str[] = "Hello";
printf("Length of string: %zu\n", strlen(str)); // 输出:Length of string: 5
4. 字符串比较
strcmp()
- 功能:比较两个字符串。
- 如果
str1
小于str2
,返回负值。 - 如果
str1
等于str2
,返回 0。 - 如果
str1
大于str2
,返回正值。
- 如果
- 原型:
int strcmp(const char *str1, const char *str2);
- 示例:
char str1[] = "abc";
char str2[] = "abcd";
printf("Comparison result: %d\n", strcmp(str1, str2)); // 输出:Comparison result: -1
strncmp()
- 功能:比较两个字符串的前
n
个字符。 - 原型:
int strncmp(const char *str1, const char *str2, size_t n);
- 示例:
char str1[] = "abcdef";
char str2[] = "abcxyz";
printf("Comparison result: %d\n", strncmp(str1, str2, 3)); // 输出:Comparison result: 0
5. 字符串查找
strchr()
- 功能:查找字符在字符串中首次出现的位置。
- 原型:
char *strchr(const char *str, int c);
- 示例:
char str[] = "Hello World";
char *pos = strchr(str, 'o');
if (pos) {printf("Found 'o' at position: %ld\n", pos - str); // 输出:Found 'o' at position: 4
}
strstr()
- 功能:查找子字符串在字符串中首次出现的位置。
- 原型:
char *strstr(const char *haystack, const char *needle);
- 示例:
char str[] = "Hello World";
char *pos = strstr(str, "World");
if (pos) {printf("Found substring at position: %ld\n", pos - str); // 输出:Found substring at position: 6
}
6. 字符串转化
atoi()
- 功能:将字符串转换为整数。
- 原型:
int atoi(const char *str);
- 示例:
char str[] = "123";
int num = atoi(str);
printf("Converted number: %d\n", num); // 输出:Converted number: 123
sprintf()
- 功能:格式化输出到字符串中。
- 原型:
int sprintf(char *str, const char *format, ...);
- 示例:
char buffer[50];
int num = 123;
sprintf(buffer, "Number: %d", num);
printf("%s\n", buffer); // 输出:Number: 123
7. 内存操作
memcpy()
- 功能:复制内存区域。
- 原型:
void *memcpy(void *dest, const void *src, size_t n);
- 示例:
char src[] = "Hello";
char dest[10];
memcpy(dest, src, 6); // 复制 6 个字节,包括 '\0'
printf("Copied string: %s\n", dest); // 输出:Copied string: Hello
memset()
- 功能:将内存区域设置为指定的值。
- 原型:
void *memset(void *s, int c, size_t n);
- 示例:
char buffer[10];
memset(buffer, 'A', 9);
buffer[9] = '\0';
printf("Buffer: %s\n", buffer); // 输出:Buffer: AAAAAAAAA
memcpy()
操作结构体的使用场景
1. 复制结构体
当需要将一个结构体的数据复制到另一个结构体时,可以使用 memcpy()
。
示例:
#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s1 = {1, "Alice", 95.5};Student s2;// 使用 memcpy 复制结构体memcpy(&s2, &s1, sizeof(Student));// 打印结果验证printf("s2.id: %d, s2.name: %s, s2.score: %.2f\n", s2.id, s2.name, s2.score);return 0;
}
输出:
s2.id: 1, s2.name: Alice, s2.score: 95.50
memset()
操作结构体的常见用法
1. 清零结构体
-
将结构体的所有成员清零是最常见的用途。
-
示例:
#include <stdio.h>
#include <string.h>typedef struct {int id;char name[20];float score;
} Student;int main() {Student s;// 使用 memset 清零结构体memset(&s, 0, sizeof(Student));// 打印结果printf("id: %d, name: %s, score: %.2f\n", s.id, s.name, s.score);return 0;
}
相关文章:
c语言 --- 字符串
创建字符串 1. 使用字符数组创建字符串 #include <stdio.h>int main() {char str[20] "Hello, world!";str[0] h; // 修改字符串的第一个字符printf("%s\n", str); // 输出:hello, world!return 0; }解释: 数组大小 20 表…...

LeetCode 热题 100_二叉树的最近公共祖先(49_236_中等_C++)(二叉树;深度优先搜索)
LeetCode 热题 100_二叉树的最近公共祖先(49_236) 题目描述:输入输出样例:题解:解题思路:思路一(深度优先搜索): 代码实现代码实现(思路一(深度优…...
(三)c#中const、static、readonly的区别
在 C# 中,const、static 和 readonly 都是用来定义不可变的值,但它们有一些关键的区别。让我们详细比较一下这三者的用途和特点: 1. const(常量) 编译时常量:const 用于声明常量,其值必须在编…...

人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用
大家好,我是微学AI,今天给大家介绍一下人工智能任务19-基于BERT、ELMO模型对诈骗信息文本进行识别与应用。近日,演员王星因接到一份看似来自知名公司的拍戏邀约,被骗至泰国并最终被带到缅甸。这一事件迅速引发了社会的广泛关注。该…...

【C++】函数(下)
1、函数的常见样式 常见的函数样式有四种: (1)无参数无返回值 (2)有参数无返回值 (3)无参数有返回值 (4)有参数有返回值 (1)无参数无返回值 示例…...

一个使用 Golang 编写的新一代网络爬虫框架,支持JS动态内容爬取
大家好,今天给大家分享一个由ProjectDiscovery组织开发的开源“下一代爬虫框架”Katana,旨在提供高效、灵活且功能丰富的网络爬取体验,适用于各种自动化管道和数据收集任务。 项目介绍 Katana 是 ProjectDiscovery 精心打造的命令行界面&…...
深入探讨 Vue.js 的动态组件渲染与性能优化
Vue.js 作为一款前端领域中备受欢迎的渐进式框架,以其简单优雅的 API 和灵活性受到开发者的喜爱。在开发复杂应用时,动态组件渲染是一项极其重要的技术,它能够在页面中动态地加载或切换组件,从而显著提升应用的灵活性与用户体验。…...

vulnhub靶场【IA系列】之Tornado
前言 靶机:IA-Tornado,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 本文所用靶场、kali镜像以及相关工具,我放置在网盘中,可以复制后面链接查看 htt…...

简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript
目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址: https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准,由一系列的标准组成,大部分由W3C&…...

C# 修改项目类型 应用程序程序改类库
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

卡通风格渲染
1、卡通风格渲染是什么 卡通风格渲染(Cartoon Shading),也称为非真实感渲染(NPR)或卡通渲染(Toon Shading) 主要目的是使3D模型看起来更像手绘的二维卡通或漫画风格,而不是逼真写实…...
ubuntu各分区的用途
在 Ubuntu 中,分区是将硬盘划分为多个逻辑部分的过程,每个分区可以用于不同的用途。合理分区可以提高系统性能、数据安全性和管理效率。以下是 Ubuntu 中常见分区及其用途的详细说明: 1. 根分区 (/) 用途:存放操作系统核心文件、…...

理解STC15F2K60S2单片机的最小电路
一、STC15F2K60S2与51单片机的区别 STC15F2K60S2和51单片机虽然都基于8051内核,但在多个方面存在显著区别: 1. CPU性能: - STC15F2K60S2:采用增强型8051 CPU,1T单时钟/机器周期,速度比普通8051快8-12倍…...

Docker官网安装
1.官网 官方文档 https://www.docker.com/ Docker Hub官网 镜像 https://hub.docker.com/ 2.Docker 的三要素 1、镜像 2、容器 3、仓库 小总结 3.Docker 平台架构图 (架构版本) 4.安装Docker CentOS | Docker Docs 1.确定你是CentOS7及以上版本 …...

成功案例分享 — 芯科科技助力涂鸦智能打造Matter over Thread模块,简化Matter设备开发
芯科科技(Silicon Labs)的愿景之一是让开发者每天都能够更轻松地开发无线物联网(IoT)。特别是在拥有相同愿景的合作伙伴的帮助下,我们每天都在取得进步。但是要想弥合知识水平和物联网开发之间的差距仍会面临一定的挑战…...

基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解
1. 背景与目标 ENSO(El Nio-Southern Oscillation)是全球气候系统中最显著的年际变率现象之一,对全球气候、农业、渔业等有着深远的影响。准确预测ENSO事件的发生和发展对于减灾防灾具有重要意义。近年来,深度学习技术在气象领域…...

【Rust自学】12.6. 使用TDD(测试驱动开发)开发库功能
12.6.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读取…...

贪心算法汇总
1.贪心算法 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 如何能看出局部最优是否能推出整体最优 靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。 如何验证可不可以…...

H266/VVC 帧内预测中 ISP 技术
帧内子划分 ISP ISP 技术是在 JVET-2002-v3 提案中详细介绍其原理,在 VTM8 中完整展示算法。ISP是线基内预测(LIP)模式的更新版本,它改善了原始方法在编码增益和复杂度之间的权衡,ISP 算法的核心原理就是利用较近的像…...
PyTorch 中的 Dropout 解析
文章目录 一、Dropout 的核心作用数值示例:置零与缩放**训练阶段****推理阶段** 二、Dropout 的最佳使用位置与具体实例解析1. 放在全连接层后2. 卷积层后的使用考量3. BatchNorm 层与 Dropout 的关系4. Transformer 中的 Dropout 应用 三、如何确定 Dropout 的位置…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...