【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语言核心技术,适合人群: ===============点个关注吧====================================================前面讲解的过程中:形式参数的改变不会影响实际参数。形式参数没有数据,只有当运行起来之后,实际参数将值传递给形式参数之后,形式参数才会有值。实参将值传递给形参之后,两者就断开联系了 阅读详情

相关推荐

eDP接口信号组成认识

eDP接口信号主要由Main Link、AUXCH与HPD三部分组成,如下图所示。 Main Link:表示主通道,用来传输各类型视频数据和音频数据; AUX CH:表示辅助通道,用于传输低带宽需求的数据,以及链路管理和设备控制信号; HPD:表示热插拔检测通道。 Main Link南1~4对数据线组成,每对数据线都是一对差分线。对于一款液晶屏而言,Main Link具体需几对数据线,这取决于屏幕的分辨率和彩色位数。 在该通道中传送的信号有视频像素信号、视频定时信号、视频格式信号、比特/像素及

精诚所至 2万+

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

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

weixin_65049945的博客 1499

保姆级教程:用Python和PyTorch复现PTB-XL心电信号分类论文(附完整代码)

本文提供了一份详细的PTB-XL心电信号分类教程,涵盖从数据预处理到模型优化的完整流程。通过PyTorch实现三种深度学习架构(Conv1D、SincNet和熵特征融合网络),并针对医疗AI特有的类别不平衡问题提供解决方案。教程包含可运行的代码示例,帮助开发者快速复现论文结果并应用于实际心电信号分析场景。

weixin_30555125的博客 405

C语言 #字符指针

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

Distinguished_z的博客 3150

保姆级教程:用Smaart7和你的USB声卡搞定现场音响系统调试(附频谱与延时测试避坑指南)

本文提供Smaart7与USB声卡协同工作的现场音响系统调试指南,涵盖硬件连接、频谱分析、延时校准等关键步骤。通过详细的操作流程和常见问题解决方案,帮助音响工程师快速掌握专业测量技术,确保演出音质达到最佳状态。

weixin_29290259的博客 424

RSA 2048/4096 签名校验算法

RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能...

qq_38769551的博客 9500

【C语言】指针笔试题

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

weixin_60478154的博客 8936

微信小程序音视频通话(for硬件)授权与设备注册实战指南

本文详细介绍了微信小程序音视频通话(for硬件)组件的开发实践,涵盖授权流程、设备注册与VoIP插件集成。重点解析了如何通过服务端获取snTicket实现用户授权,确保硬件设备与微信端的音视频通话安全可靠,适用于智能门禁、话机等物联网场景。

u6v7w8x的博客 945

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

33、嵌入式系统中的内存操作与实时操作系统

本博客详细探讨了嵌入式系统中的内存操作和实时操作系统(RTOS)的基本原理及应用。内容涵盖C、C++和MicroPython三种语言下的SDRAM读写示例,并结合机器人真空吸尘器的实际应用说明内存的使用场景。此外,还介绍了RTOS的核心概念、组件及其工作机制,包括任务、事件、互斥锁、信号量、队列等,并以FreeRTOS和Mbed OS为例展示了RTOS的配置与使用方法。最后,通过常见问题和实践项目加深对嵌入式系统开发的理解。

zz67890的博客 145

微信小程序 - 详细解决web-view公众号文章或第三方网站分享转发后打开失败,页面显示“无法打开该页面,不支持打开“、“页面不存在“报错提示,苹果IOS系统手机打开是空白页,安卓手机系统会有提示!

微信小程序,公众号文章,第三方H5网页,内嵌网站分享后打不开,web-view,页面分享,小程序里公众号文章转发后无法打开,白屏,页面空白什么都没有,不支持打开,无法打开该页面,页面不存在,业务域名配置好了还是不行,公众号和小程序已经关联,iOS端苹果真机打开空白页,安卓手机,页面分享后,用户打不开提示错误,提示页面不存在,如何解决页面提示无法打开该页面,微信小程序web-view无法打开该页面不支持打开的解决方法,无法打开该页面不支持打开,最新详细解决方案,分享之后无法打开页面,提示无法打开该页面,不支持

🏆 前端领域优质创作者 1万+

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万+

实战复盘:纷玩岛(Livelab)候补订单微信支付协议的逆向与复现

通过本次对纷玩岛候补支付接口的分析,我们实现了一个脱离 App UI 的轻量级支付发起器。这不仅验证了其API的设计逻辑(Standby -> PrePayInfo 分层设计),也为后续的自动化监控或辅助抢票工具提供了支付环节的技术验证。技术本无罪,关键在于如何使用。理解这些底层协议,有助于我们写出更健壮的代码,也能在遇到线上支付问题时快速定位是业务层(API)问题还是通道层(微信)问题。

猫敷雪 801

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

C字符串

iccoke的博客 1091

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

敖丙007的博客 469

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

03C语言基础-指针

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

LJLThomson的博客 655

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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、付费专栏及课程。

余额充值