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 的位置…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...