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 的位置…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...
