【C语言】-指针03(指针与字符串)

【C语言】指针 C语言指针相关操作用法详解 阅读详情

1、字符串基本信息

字符串是以空字符(\n)结尾的char类型数组。
用双引号扩起来的内容称为字符串字面量,即字符串常量。编译器会在末尾自动加入\0字符,其属于静态存储类别。

1.1、在程序中定义字符串

1、字符串常量
字符串存储在只读存储区,不可修改。生命周期为程序运行全程,无需手动释放。

const char* str = "Hello, World!";  // 推荐加const

2、用数组创建字符串
数组在栈上分配空间,可以修改内容。数组的长度由初始化值自动确定,包含’\0’。
字符串存储在静态存储区中,但程序运行时,才会将字符串拷贝到数组中,此时字符串有两个副本。

char str[] = "Hello";  // 自动计算长度为6(含'\0')
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};	/* 与上一句等效 */

3、使用指定大小的字符数组创建字符串
预分配固定大小,若初始长度不足,剩余空间使用’\0’填充,需要放置溢出,并留出空间给’\0’。而且数组名是常量,不可自加或自减。
字符串存储在静态存储区中,但程序运行时,才会将字符串拷贝到数组中,此时字符串有两个副本。

char str[20] = "Hello";  // 预分配20字节,剩余空间填充'\0'
char str[5] = "Hello";  // 错误:数组长度至少为6(含'\0')

4、使用动态内存分配
数据存储在堆上,需要手动控制生命周期。

char* str = (char*)malloc(10 * sizeof(char));  // 分配10字节
strcpy(str, "Hello");  // 复制字符串到分配的内存

2、常见的字符串操作库函数

在 C 语言中,字符串的输入输出主要通过标准库 <stdio.h> 提供的函数实现。字符串操作主要依赖于标准库 <string.h> 。

字符串操作库函数对比表

功能常用函数安全版本(推荐)说明
长度strlen-返回字符串长度(不含'\0')
复制strcpystrncpy、snprintfstrncpy需手动补'\0';snprintf自动截断
连接strcatstrncat、snprintfstrncat自动补'\0';snprintf需指定缓冲区大小
比较strcmp、strncmp-返回值:<0(小于)、0(等于)、>0(大于)
查找strchr、strrchr、strstr-strchr(首次出现)、strrchr(最后出现)、strstr(子串查找)
分割strtok-破坏性分割,修改原字符串;线程不安全(用strtok_r替代)
内存操作memcpy、memsetmemcpy_s(非标准)memcpy需确保目标缓冲区足够大;memset用于初始化内存

字符串输入输出函数对比表

函数用途是否安全特点
printf格式化输出✅支持各种格式控制(如%s、%d),需手动控制宽度(如%10s)
puts输出字符串并换行✅自动添加'\n',简单但功能有限
scanf格式化输入❌(需手动限制)遇空格、制表符或换行符停止,需用%ns防止溢出(n为缓冲区大小-1)
fgets读取一行(含换行符)✅自动截断防溢出,需手动处理'\n'(如str[strlen(str)-1]='\0')
gets读取字符串(已弃用)❌不检查缓冲区大小,导致溢出,C11标准已移除该函数

2.1、字符串长度和复制

  • 1、strlen - 计算字符串长度
#include <string.h>
size_t strlen(const char* s);

const char* str = "Hello";
printf("Length: %zu\n", strlen(str));  // 输出:5
  • 2、strcpy - 复制字符串(strncpy - 安全复制指定长度)
    strcpy 不检查目标缓存区大小,可能会导致溢出
    strncpy 最多复制 n 字节,若 src 长度不足,用 ‘\0’ 填充。
char* strcpy(char* dest, const char* src);
char* strncpy(char* dest, const char* src, size_t n);

char dest[10];
strcpy(dest, "World");  // dest内容:"World\0"

char dest[5];
strncpy(dest, "Hello", 4);  // dest内容:"Hell"(无'\0'!)
dest[4] = '\0';  // 需手动添加终止符

2.2、字符串连接和比较

  • 1、strcat - 连接字符串(strncat - 安全连接指定长度)
    strcat 不检查 dest 剩余空间,可能溢出。
    strncat 安全连接指定长度。
char* strcat(char* dest, const char* src);
char* strncat(char* dest, const char* src, size_t n);

char dest[20] = "Hello, ";
strcat(dest, "World");  // dest内容:"Hello, World\0"

char dest[10] = "Hello";
strncat(dest, ", World", 2);  // dest内容:"Hello, W\0"
  • 2、strcmp - 比较字符串(strncmp - 比较前 n 个字符)
    返回值:< 0:s1 小于 s2(按字典序)。0:s1 等于 s2。> 0:s1 大于 s2。
int strcmp(const char* s1, const char* s2);
int strncmp(const char* s1, const char* s2, size_t n);

if (strcmp("apple", "banana") < 0) {
    printf("apple comes before banana\n");
}

if (strncmp("apple", "appetite", 3) == 0) {
    printf("First 3 characters match\n");
}

2.3、字符串查找和分割

  • 1、strchr - 查找字符首次出现位置(strrchr - 查找字符最后一次出现位置)
char* strchr(const char* s, int c);
char* strrchr(const char* s, int c);
char* strstr(const char* haystack, const char* needle);		/* 查找子字符串 */

const char* str = "Hello";
char* p = strchr(str, 'l');  // p指向"lllo"
printf("%s\n", p);  // 输出:"llo"

const char* str = "Hello";
char* p = strrchr(str, 'l');  // p指向"o"前的'l'

【C语言从不挂科到高绩点】21-指针03-指针与函数【重点知识】 Hello!彦祖们,俺又回来了!!!,继续给大家分享 《C语言从不挂科到高绩点》课程!! 本节将为大家讲解C语言中非常重要的知识点-指针:本套课程将会从0基础讲解C语言核心技术,适合人群: ===============点个关注吧====================================================前面讲解的过程中:形式参数的改变不会影响实际参数。形式参数没有数据,只有当运行起来之后,实际参数将值传递给形式参数之后,形式参数才会有值。实参将值传递给形参之后,两者就断开联系了 阅读详情

相关推荐

第4章 本地一键部署(新手首选)

本文介绍了OpenClaw的本地部署方法,特别适合新手用户。部署过程仅需执行一条命令,通过自动脚本完成安装和配置向导。安装完成后,用户可通过终端TUI或Web控制面板验证部署是否成功。文章还提供了常见问题的排查方法,包括端口占用、权限不足、APIKey无效和安装卡顿等情况。整个部署流程简单直观,无需手动修改配置文件,适合快速搭建使用。

eastyuxiao的专栏 194

C语言_03_指针、指针高级、字符串

指针相关,如二/多级指针、数组指针、指针数组、函数指针等;字符串相关,如定义、细节、常用函数等。内容较多,但感觉字符串和二维数组有较大联系,放在一篇文章中。

weixin_65049945的博客 1499

LTspice introduction - 2 LTspice的界面

LTspice的界面主要有两个:Schematic Capture和Waveform Viewer Schematic Capture 它主要是用来画电路图的,画完电路图之后,添加一些dot 命令同时选择一些仿真的参数,点击执行(Run)Waveform Viewer 如果你的仿真不是op point的话,一个都会打开它,在它里面你可以画图相应的图形。 有两种方式可以在Viewer

贾亮的专栏 3221

C语言 #字符指针

以例子为导向来分析字符指针的中存的是什么,以及常量字符串在内存中是如何存储的。1、字符指针就是指针变量指向的对象是字符类型,即指针变量的类型为 char*;2、指针p中存放的是常量字符串在常量区存放的首字符 'a' 的地址3、常量字符串存放在内存中的常量区,常量区中的数据只能读取而不能被修改。

Distinguished_z的博客 3150

ARM CMSIS DAP源码分析(二)

今天分析的是RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)和RDDI_DAP_SetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)这两个函数。 以RDDI_DAP_GetARMRegs(DWORD *regs, DWORD *rfpu, ULONG64 mask)为例,代码如下:

pengxiao618的专栏 7977

鸿蒙OS+UniApp文件上传实战:如何解决大文件分片上传的3大坑?

本文深入探讨鸿蒙OS与UniApp结合实现大文件分片上传的实战方案,重点解决分片策略设计、网络中断处理和进度管理三大技术难题。通过鸿蒙分布式特性与UniApp跨平台能力的结合,提供动态分片调整、断点续传和跨设备进度同步等优化方案,显著提升大文件上传成功率和用户体验。

weixin_29250403的博客 474

【C语言】指针笔试题

C语言指针笔试题,你值得观看 不看后悔

weixin_60478154的博客 8936

YOLOv5改进 | 低照度检测 | 2024最新改进CPA-Enhancer链式思考网络(适用低照度、图像去雾、雨天、雪天)

本文给大家带来的2024.3月份最新改进机制,由CPA-Enhancer: Chain-of-Thought Prompted Adaptive Enhancer for Object Detection under Unknown Degradations论文提出的CPA-Enhancer链式思考网络CPA-Enhancer通过引入链式思考提示机制,实现了对未知退化条件下图像的自适应增强。该方法的核心在于能够利用CoT提示对图像退化进行动态分析和适应,从而显著提升物体检测性能。

Snu77的博客 2222

C语言指针和字符串练习

Problem A:【函数的指针参数】数组排序 题目描述 使用自定义函数void sort(int *a, int n); 对数组a中的整数进行排序(升序) 函数的参数:a为数组(指针),n为数组中元素的个数。 裁判程序如下: 输入 一组整数(不超过10个),每个整数的绝对值不超过1000,读取到输入结束 输出 按升序输出,每行一个 样例输入 3 1 4 1 5 9 样例输出 1 1 3 4 5 9 答案 void sort(int *a,int n){ int temp; for(int i=

Lulutia的博客 2114

统信UOS丨开机无法进入系统 无法打开控制台访问权限,root账号被锁定(cannot open access to console, the root account is locked)

步骤四:分别打开文件发现Roota下的fstab就是我们要找的文件,打开查看Roota的属性发现其为挂载的磁盘nvme0n1p3。步骤三:按Win+E打开文件管理器在分区中查找/etc/fstab文件,发现Roota和Rootb下都有该文件。步骤二:按键盘Ctrl+Alt+F4,进入终端控制台,如下图所示输入startx回车,进入桌面。步骤一:找到UOS系统安装的U盘,选择U盘启动进入安装界面,如下图所示。步骤七:关机,拔出U盘,启动电脑,OK,问题解决。

Reyn_观极 1万+

【30天从零玩转AI应用开发】第16篇:智能体Agent入门——ReAct框架原理+首个会思考、会动手的AI实战

摘要: 本文介绍了AI智能体(Agent)的核心概念及其与普通大模型(LLM)的区别。通过ReAct(Reason+Act)框架,智能体实现了自主思考、调用工具和分步执行的能力。文章详细讲解了LangChain Agent的四大组件,并推荐新手使用ZERO_SHOT_REACT_DESCRIPTION类型。最后提供了一个完整的智能体实战代码示例,该智能体具备数学计算和天气查询功能,能够自主选择工具完成任务,展示了AI从”被动回答“到”主动行动“的关键进化。

在上海谋生的软件喵记录喵生 626

C语言学习笔记03:C语言_字符串_局部变量_全局变量_指针

文章目录C语言第七课程笔记1. 内容安排2. 课堂笔记2.1 字符串语法2.2 字符串操作2.3 函数注意点2.4 void 用法2.5 局部变量全局变量2.6 函数声明2.7 return 关键字的作用C语言第八课程笔记1. 内容安排2. 课堂笔记2.1 函数设计基本原则2.2 指针变量和普通变量区别2.3 指针变量理解2.4 修改一个变量的值2.5 指针类型2.6 指针和数组C语言第九天课程笔记1. 内容安排2. 课堂笔记 C语言第七课程笔记 每一天的笔记包含如下内容: 当天授课内容安排 课堂重点内容

JasonYangQ的博客 1万+

8、干式变压器

干式变压器的发展,是人类不断挑战材料科学和热物理极限的过程,每一次技术突破,都是在。温度升高,ε_r反而下降(因为分子活动性增强,极化响应变慢)。:固体导热的热阻比液体对流大一个数量级,这是无法逾越的物理规律。Nomex在高温下不是逐渐分解,而是保持性能直到一个临界点。如果 T_a = 40°C,则 T_c = 146.7°C。干式变压器(固体介质分隔):热场、电场、流场(空气)形成三维氢键网络,即使在高温下也能保持机械强度。:不是在现有技术上修修补补,而是寻找新的。仍在H级绝缘允许范围内(≤180°C)

renpeng2692873032的博客 228

C语言字符串——关于指针

C字符串

iccoke的博客 1091

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C语言_字符串与指针的爱恨情仇

C语言_字符串与指针的爱恨情仇 char[]与char*的区别 何为字符串常量空间? 函数指针 二级指针函数 指针数组 eg: 🔓二级指针函数

敖丙007的博客 469

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

03C语言基础-指针

C语言基础-指针 1.简介 什么是指针,指针就是内存地址,32位占用4字节,64位占用8字节,指针变量是用来存放内存地址的变量。 简单理解:指针4字节或8字节的内存空间,用于存储内存地址。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JA50x4gM-1625062971571)(G:\markdown\C++\一级指针.PNG)] 通过上面图,我们可以得出以下结论: 1.p指针所指向的地址发生改变,并不会影响到之前指向的地址 2.p所指向的地址数值发生改变,则所指向的地址

LJLThomson的博客 655

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

c语言int转字符串_C语言零基础入门-指针-05

C语言零基础入门-指针-05 本节要点: 1,字符指针。 2,字符串指针。 3,指针的参数传递 4,多重指针01. 字符指针这里的定义与前面的基本一样,所谓的字符指针就是这个指针指向的是一个字符型的变量。01.1 单个字符代码如下:#include首先定义了一个字符型变量a。由于指针p将要指向的变量的字符类型的,所以指针变量p定义的时候前面的数据类型也是char。02. 字符串指针单个字符的指针与...

weixin_39734048的博客 791

c语言在输出字符串时可以用指针,C语言—字符串、指针

---字符串1.字符串"jack" == 'j' + 'a' + 'c' + 'k' + '\0' 用数组保存字符串char name[10] = "jack";printf(name);2.字符串的一些定义都是字符串(\0的ASCII码值是0)char name[8] = "it";char name2[8] = {'i','t','\0'};char name3[8] = {'i','t'...

weixin_32666933的博客 1119

C语言中字符串的处理方式

http://www.cnblogs.com/robin-ty/archive/2010/09/03/1817294.html 交流纽带”                               --《C语言程序设计 现代方法》   写多了 Java 代码,对 String 类 很是喜爱,可惜经典的 C 语言没有。。。最近在做程序过程中,发现对C语言字符串的处理很模糊,一会儿...

weixin_33762321的博客 3207

03-C语言进阶——模拟实现字符串操作函数

模拟实现字符串操作函数1.模拟实现strcat2.模拟实现str3.模拟实现 1.模拟实现strcat //1.模拟实现strcat char * my_strcat(char *destination, const char * source) { //首先定义一个指针指向destination起始地址,便于操作完成后返回原始字符串的首地址 char *dest = destination; //判断两个字符串是否为空 assert(destination != NULL); assert(so

2029

C语言03 - 函数指针、内存分配、字符串使用

1. 函数指针int plus(int a, int b){ return a + b; }// 函数名是一个函数的首地址,我已我们可以将函数赋值给对应类型的函数指针 int minus(int a, int b){ return a - b; }int plus2(int *a, int *b){ return *a + *b; }int minus2(char *a, c

ZekingLee 826

C语言指针与内存管理:指针使用、内存泄漏与调试技巧

在C语言的编程世界里,指针和内存管理无疑是最基础也是最强大的工具之一。它们为程序员提供了对内存的直接控制,使得程序能更加灵活、高效地运行。但与此同时,这种强大的功能也带来了巨大的风险——不当的内存管理可能导致内存泄漏、崩溃,甚至严重影响程序的性能和稳定性。因此,掌握指针和内存管理不仅是编写高效程序的关键,也是每个C语言程序员必须掌握的核心技能。本文将带领你深入了解C语言中的指针概念、数组与指针的关系、动态内存分配的实现以及如何避免和调试常见的内存错误。

吴师兄大模型的博客 1538

【C语言】C语言字符串 | 关于String | 通过国外教材讲解字符串 | 专栏遗漏知识点补充

考虑到之前在专栏中讲字符串的时候有些知识点没有详细地讲解,所以本篇是对字符串相关的知识点的补充篇!例如 %s 输出左对齐右对齐,限制格数等知识,在那个专栏的部分代码中出现了,但只是用注释简单的提了下,并没有详细地讲,所以本篇将针对部分遗漏的知识点进行补充和巩固。本篇通过C语言教材《The C Programming Language》作为参考进行讲解。

有道无术, 术尚可求。有术无道, 止于术。 3104

C语言:指针典型例题剖析

一、做题前的重点知识回顾本篇重点讲解一维数组、字符数组、二维数组的sizeof和strlen的应用,首先要先回顾以下知识(在博主指针专题的深入理解指针(1)、(2)和(3)中有详细学习)一、做题前的重点知识回顾。

weixin_51142926的博客 9943

指针详解——C语言版

指针指针用法初次介绍指针的重要性指针的定义指针的分类1、基本类型指针2、 指针和数组3、指针和函数4、指针和结构提5、多级指针 指针用法初次介绍 在C语言中,允许用一个相关变量来存放指针,这种变量称为指针变量。 指针变量遵循先定义、后使用的原则。对指针变量的定义包括三个部分: (1)指针类型说明,即定义变量为一个指针变量; (2)指针变量名; (3)变量值(指针)所指向的变量的数据类型。 其定义形式如下: 类型名 * 指针变量名 例如: int *p ;char *n;等等 另外两个相关的运算符:

学习日记 1108

数组赋值给指针_8.4 C语言通过指针引用字符串

01字符串的引用方式1、在C程序中,字符串是存放在字符数组中的。2、用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个字符,也可以通过数组名和格式声明%s输出该字符串。3、用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。4、通过字符数组名或字符指针变量可以输出一个字符串,而对一个数值型数组,是不能企图用数组名输出它的全部元素的。02字符指针作函数参数1、如果想把一个...

weixin_39589557的博客 1384
上一篇: 【C语言】-指针02(指针与数组)
下一篇: 【STM32】启动流程
Wangshanjie_98
博客等级 码龄7年 134粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值