【C++】三、const与字符串

字符串 字符数组 字符串数组 const 字符串和内存的操作函数 字符串 字符串:0或N个有效字符的集合 且以'\0'作为结束标志 C语言中字符串数据以字符数组的形式存储; "hello uplooking!"常量字符串 以首地址形式存在 字符数组及大小 char s1[]={'h','e','l','l','o'};//字符数组 sizeof(s1)=5B 字符串数组及大小 char s2[]={'h','e','l','l','o'... 阅读详情


1.const

参考 const总结
为什么使用const?采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替),分类如下:

1.1常变量

const 类型说明符 变量名

1.2常引用

const 类型说明符 &引用名

1.3常对象

类名 const 对象名

1.4常成员函数

类名::fun(形参) const

1.5常数组

类型说明符 const 数组名[大小]

1.6常指针

const 类型说明符* 指针名
const int *c //所指向的内存数据不能被修改,但是本身的地址可以修改

类型说明符* const 指针名
const * const d;//指针变量不能被修改,但是它所指向的内存空间可以修改

const int * const e;//指针变量与所指向的内存空间都不能修改

首先提示的是:在常变量(const 类型说明符 变量名)、常引用(const 类型说明符 &引用名)、常对象(类名 const 对象名)、 常数组(类型说明符 const 数组名[大小]), const” 与 “类型说明符”或“类名”(其实类名是一种自定义的类型说明符) 的位置可以互换,如const int a=5; 与 int const a=5; 等同

2.字符串

sizeof():返回字符类型的字节数
“\0”表示字符串的结束符

1、函数名: strcpy

功 能: 将参数src字符串拷贝至参数dest所指的地址
用 法: char *strcpy(char *dest, const char *src);
返回值: 返回参数dest的字符串起始地址
说 明: 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代

char *strcpy(char *dest, const char *src)
{
assert(dest != NULL && src != NULL);
char *result = dest;
while ((*dest++ = *src++) != '\0');
return result;
}

2、函数名: strncpy

功 能: 将字符串src前n个字符拷贝到字符串dest
用 法: char *strncpy(char *dest, const char *src, size_t n);
返回值: 返回参数dest的字符串起始地址
说 明: 不像strcpy(),strncpy()不会向dest追加结束标记’\0’;
src和dest所指的内存区域不能重叠,且dest必须有足够的空间放置n个字符;

char *strncpy(char *dest, const char *src, size_t n)
{
assert(dest != NULL && src != NULL);
char *result = dest;
while(n--&&(*dest++=*src++)!='\0');
return result;
}

3、函数名: strcat

功 能: 字符串拼接函数
用 法: char *strcat(char *dest, const char *src);
返回值: 返回dest字符串起始地址
说 明: strcat() 会将参数src字符串复制到参数dest所指的字符串尾部;
dest最后的结束字符’\0’会被覆盖掉,并在连接后的字符串的尾部再增加一个’\0’;
dest与src所指的内存空间不能重叠,且dest要有足够的空间来容纳要复制的字符串;

char *strcat(char *dest, const char *src)
{
assert(dest!=NULL && src!=NULL);
char *result = dest;
while (*dest != '\0')++dest;
while ((*dest++ = *src++) != '\0');
return result;
}

4、函数名: strncat

功 能: 将n个字符追加到字符串的结尾
用 法: char *strncat(char *dest, const char *src, size_t n);
返回值: 返回dest字符串起始地址
说 明: strncat()将会从字符串src的开头拷贝n个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串;
如果n大于字符串src的长度,那么仅将src全部追加到dest的尾部;
strncat()会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’;

char *strncat(char *dest, const char *src, size_t n)
{
assert(dest != NULL && src != NULL);
char *result = dest;
while (*dest != '\0')++dest;
while (n-- && (*dest++ = *src++) != '\0');
*dest = '\0';
return result;
}

5、函数名: strchr

功 能: 在一个字符串中查找给定字符的第一个匹配之处
用 法: char *strchr(const char *str, int c);
返回值: 如果找到指定的字符则返回该字符所在地址,否则返回NULL
说 明: 返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串的位置;
字符串str的结束标志‘\0’也会被纳入检索范围,所以str的最后一个字符也可以被定位;
如果希望查找某字符在字符串中最后一次出现的位置,可以使用 strrchr() 函数;

char *strchr(const char *str, int c)
{
assert(str!=NULL);
for (; *str != c; str++) {
 if (*str == '\0')
 	return NULL;
}
return (char*)str;

}

6、函数名: strcmp

功 能: 字符串比较
用 法: int strcmp(const char *s1, const char *s2);
返回值: 根据ASCII码比较,若参数s1和s2字符串相同则返回0,s1若大于s2则返回大于0的值,s1若小于s2则返回小于0的值
说 明: 它是区分大小写比较的,如果希望不区分大小写进行字符串比较,可以使用stricmp函数

int strcmp(const char *s1, const char *s2)
{
assert(s1!=NULL &&s2!=NULL);
while (s1 && s2 && (s1 == s2)) {
 ++s1;
 ++s2;
}
return (*s1 - *s2);
}

7、函数名: strlen

功 能: 计算指定的字符串s的长度,不包括结束字符’\0’
用 法: size_t strlen(const char *s);
返回值: 返回字符串s的字符数
说 明: strlen() 函数计算的是字符串的实际长度,遇到第一个’\0’结束;
如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到’\0’停止;
sizeof返回的是变量声明后所占的内存数,不是实际长度,此外sizeof不是函数,仅仅是一个操作符,strlen()是函数;

size_t strlen(const char *s)
{
assert(s != NULL);
size_t len=0;
while (*s++ != '\0')
 ++len;
return len;
}

8、函数名: strstr

功 能: 检索子串在字符串中首次出现的位置
用 法: char *strstr( char *str, char * substr );

char *strstr(char *str, char * substr)
{
assert(str!=NULL && substr!=NULL);
char *s = str;
char *t = substr;
for (; *str != '\0'; str++){
 for (s = str, t = substr; *t != '\0' && *s == *t; ++s, ++t);
 if (*t == '\0')return (char*)str;
}
return NULL;
}

9、函数名: strpbrk

功 能: 返回两个字符串中首个相同字符的位置
用 法: char *strpbrk(const char *s1, const char *s2);
返回值: 如果s1、s2含有相同的字符,那么返回指向s1中第一个相同字符的指针,否则返回NULL
说 明: strpbrk()不会对结束符’\0’进行检索

char *strpbrk(const char *s1,const char *s2)
{
assert(s1!=NULL && s2!=NULL);
const char *s,*t;
for(s=s1;*s!='\0';s++)
 for (t=s2; *t != '\0'; t++)
 {
 	if (*s == *t)
    return (char*)s;
 }
return NULL;
}

10、函数名:strspn

功能:返回字符串s中第一个不在accept字符串中出现的字符下标
用法:size_t strspn(const char *s,const char *accept);
返回值:返回字符串s开头连续包含字符串accept内的字符数目
说明:strspn()从参数s 字符串的开头计算连续的字符,而这些字符都完全是accept 所指字符串中的字符。简单的说,若strspn()返回的数值为n,则代表字符串s 开头连续有n 个字符都是属于字符串accept内的字符。

size_t strspn(const char *str, const char *accept)
{
assert(str!=NULL && accept!=NULL);
size_t count=0;
const char *s,*t;
for (s = str; *s != '\0'; s++) {
 for (t = accept; *t != '\0'; t++) {
 	if (*s == *t)
   break;
 }
 if (*t == '\0')
 	return count;
 ++count;
}
return count;

}

11、函数名 : strtok

功 能 : 根据分界符将字符串分割成一个个片段
用 法 : char *strtok(char *s, const char *delim);
返回值 : 返回下一个分割后的字符串指针,如果已无从分割则返回NULL
说 明 : 当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为’\0’字符;
在第一次调用时,strtok()必须赋予参数s字符串,往后的调用则将参数s设置成NULL;

char *strtok_r(char *s, const char *delim, char **save_ptr) {
char *token;
if (s == NULL) s = *save_ptr;
/* Scan leading delimiters.  */
s += strspn(s, delim);
if (*s == '\0')
 return NULL;
/* Find the end of the token.  */
token = s;
s = strpbrk(token, delim);
if (s == NULL)
 /* This token finishes the string.  */
 *save_ptr = strchr(token, '\0');
else {
 /* Terminate the token and make *SAVE_PTR point past it.  */
 *s = '\0';
 *save_ptr = s + 1;
}
return token;
}

char *strtok(char *s, const char *delim)
{
static char *last;
return strtok_r(s, delim, &last);
}
const描述符可修饰全局函数吗?为什么C#有const和readonly两种常量关键字?C++成员函数为什么可以由const和非const版本?const常量的不同形式? C++可以用const修饰成员函数,表示成员函数不会修改任何类成员,这是安全的编码习惯。注意,这仅仅适用于类的成员函数,如果是形如C语言的全局函数,是不可以用const修饰。但,const可以修饰函数参数。 阅读详情

相关推荐

C++ const使用详解

在主函数main()里,标识符gc的值在编译期间是不知道的,这也意味着需要存储空间,但是初始化要在定义点进行,而且一旦初始化,其值就不能改变,我们发现c2是由gc计算出来的,它的作用域与其他类型const的作用域是一样的,这是对#define用法的一种改进。如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。const同样运用于类中,但是它的意义又有所不同,我们可以创建const的数据成员,const的成员函数,甚至是const的对象,但是保持类的对象为const比较复杂,

程序猿老樊的博客 1390

C/C++ 常用字符串函数实现

1、 函数名: strcpy 功 能: 将参数src字符串拷贝至参数dest所指的地址 用 法: char *strcpy(char *dest, const char *src); 返回值: 返回参数dest的字符串起始地址 说 明: 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况,在编写程序时需特别留意,或者用strncpy()来取代 char *strcpy(cha...

qq_28609735的博客 537

咱们一起学C++ 第一百二十三篇:之const在类中的应用(三)

在C++的学习之路上,我们一同前行,每一次分享都希望助力大家更好地理解这门语言。此次,我们将深入探讨const在类中的应用,特别是关于编译期间类里的常量以及旧代码中处理类似需求的“enum hack”方法。理解这些内容对于编写高效、兼容且规范的C++类至关重要。希望通过本次讲解,大家能清晰掌握如何在类中正确使用const来创建编译期间常量,以及了解历史遗留的编程技巧,一起在C++的知识海洋中继续成长,共同进步。

wj_rdk的博客 1291

字符串--const类型限定符、字符处理函数(修改首字母的大小写)、数值字符串向数值得转换

通过采用指针或数组作函数参数,可使调用者获得修改后的数据,但有时我们只希望将数据传到被调函数的内部,而并不希望它们在函数内被修改,此时,为了防止数据被意外修改,也为了让函数功能更明确(明确表示程序员的意图,不希望它们被修改),可使用const对参数进行限定。由于p是一个常量指针,是只读的,其值是不可被修改的,所所以在执行程序中不能修改指针p,让他指向其他变量。虽然这里*p的值是不可修改的,但p指向的变量a的值仍是可以修改的,即对a执行赋值操作是合法的。它表明p和*p都是一个常量,都是只读的。

ww1425408527的博客 666

智算中心建设全流程指南:从规划到落地

智算中心的建设是一个复杂而系统的过程,涉及选址、立项、办理相关手续、设计、土建、机电安装、调试、验收等多个环节。每个环节都需要充分考虑各种因素,并注意相关的事项,以确保智算中心的顺利建设和高效运行

数据中心全生命周期价值管理 3396

如何下载安装Qt各个版本?(2025-4-28更新)

本文将教您快速获取Qt各版本安装包!妈妈再也不用担心我找不到Qt安装包了!

程序区 5118

c语言const字符串,C语言之正确使用const

一、const用途const是一个C语言的关键字,它限定一个变量不允许被改变。1、const与基本类型const char m;//限定m不可变。2、const与指针1)、const在*前面const char *p; //*p是const,p可变char const * p;//*p是const,p可变2)、const在*后面char * constp;//p是const,*p可变3)、cons...

weixin_42134537的博客 3344

永磁同步电机矢量控制——从三相静止坐标系到d-q坐标系的数学转换

本文深入解析了永磁同步电机矢量控制的核心——从三相静止坐标系到d-q旋转坐标系的数学转换。通过Clark变换和Park变换,将复杂的三相交流系统解耦为易于控制的直流量,从而实现对电机转矩和磁场的独立、精准控制。文章结合物理图像与工程实践,详细阐述了坐标变换的原理、公式推导及其在磁场定向控制(FOC)中的关键作用。

weixin_29294395的博客 117

C语言 总结const的用法

3 总结通过这篇博客,我对const修饰变量、数组、指着和函数参数进行了归纳总结。总体来说有几个点需要注意:const修饰变量,不能被直接修改const修饰指针指向的内容时(const int * p=&a),指针指向内容(*p)不能被修改,但指针本身§可以被修改。const修饰指针本身时(int * const p =&a),指针指向的内容(*p)可以被修改,但是指针本身(p)不能被修改。const 修饰字符串 (const *p=“abcd”;)和(const p[]=“abcd”;..........

weixin_40933653的博客 5293

JLink 添加国产芯片手把手教程(雅特力 + 华大)

拷贝厂商算法文件夹 + 配置 JLinkDevices.xml。雅特力直接复制官方配置,华大按需添加芯片节点,操作一次,永久生效,以后调试 AT32、HC32 再也不用愁找不到型号。这套方法适配全版本 JLink,也是国产 MCU 替代项目的必备技能,看完照着做,新手也能轻松搞定。百度网盘资料分享:通过网盘分享的文件:jink驱动(包括新增芯片型号)链接: https://pan.baidu.com/s/14SLgrPfyof1lglD6VQguAw?pwd=cfuq 提取码: cfuq。

weixin_48867130的博客 710

OpenClaw 钉钉和飞书集成方案研究 & OpenClaw 研究分析报告

OpenClaw(原名 Clawdbot,曾用名 Moltbot)是一款开源的个人 AI 智能体,采用"本地优先"设计理念。与传统聊天机器人不同,OpenClaw 具备真正的系统级执行能力,能够实际操作用户的计算机系统,完成各种实际任务。核心优势本地部署:所有数据存储在用户本地设备,隐私零泄露系统级执行:具备完整的系统访问权限,可执行文件操作、命令运行等全渠道交互:支持多种即时通讯平台作为交互界面开源透明:MIT 许可证,代码完全开放,社区驱动开发应用场景个人助理:日程管理、任务提醒、邮件处理。

AI天才研究院 2340

C++ 中 char\ 、const char\ 、char\ const、const char\ const 的区别:一篇彻底讲清指针与 const 的组合

fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;是否是否是否声明: X ptrconst 在 * 左侧?指向的内容不可修改指向的内容可以修改const 在 * 右侧?const 在 * 右侧?指针和内容都不可修改指向的内容不可修改指针可修改内容可修改指针不可修改char*内容和指针都可修改这四种声明的本质区别在于。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1225

Vue3 - 超详细最新 wangEditor V5 富文本编辑器安装引入及使用教程,提供工具栏配置、基础富文本功能、API使用示例教程等(新手小白快速引入并植入到项目中)

vue3,wangEditorv5富文本编辑器,wangEditorv5官方文档,vue3最新安装wangEditorv5富文本详细使用教程,vue3使用wangEditorv5编辑器示例代码,vue3网站网页安装植入富文本编辑器教程,vue3wangEditor使用api,vue3安装富文本控制台出现报错如何解决,vue3wangEditor-v5工具栏配置,vue3中使用富文本编译器wangEditor5的方法,wangeditor5在vue3中的全使用过程,vue3超详细最新wangedi

🏆 前端领域优质创作者 4253

C++ 中 char*、const char*、char* const、const char* const 的详细区别

C++ 中 char*、const char*、char* const、const char* const 的详细区别

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1715

海思3516A移植MT7601U编译过程记录

官方地址:https://www.mediatek.com/products/broadbandWifi/mt7601 tar -xjf DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2 cd DPO_MT7601U_LinuxSTA_3.0.0.4_20130913 1> Makefile替换 PLATFORM = HISI_3516A ifeq ($(PLATFORM),HISI_3516A) LINUX_SRC = /home/wbk/test/linu

qq_39048131的博客 1230

996引擎 - 读写变量性能测试

单轮100万次读写,取3轮平均耗时(毫秒),有效读取率均为100%,数值越小性能越优。

灵台方寸山斜月三星洞 244

C++ const 用法全面总结与深度解析

const├── 变量修饰│ ├── 基本类型常量│ ├── 自定义类型常量│ └── 全局/局部常量├── 指针修饰│ ├── 指向常量的指针 (const T*)│ ├── 常量指针 (T* const)│ └── 指向常量的常量指针 (const T* const)├── 引用修饰 (const T&)├── 函数相关│ ├── 参数修饰 (const T, const T*, const T&)

码事漫谈 1560

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

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

C++中的const_c++ const变量

C++ 中的 const 变量虽然也会占用内存,也能使用获取得它的地址,但是在使用时却更像编译时期的#define;#define也是值替换,可见范围也仅限于当前文件。很多C++教程在对比 const 和 #define 的优缺点时提到,#define 定义的常量仅仅是字符串的替换,不会进行类型检查,而 const 定义的常量是有类型的,编译器会进行类型检查,相对来说比 #define 更安全,所以鼓励大家使用 const 代替 #define。

2401_84240431的博客 968

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C/C++中的const

如果是 const 在 * 之前,如 const int *p ,表示指针 p 所指向的内容是常量,不能通过 p 来修改它指向的内容,但 p 本身可以指向其他地址;如果 const 在 * 之后,如 int * const p ,则表示指针 p 本身是常量,不能再指向其他地址,但可以通过 p 修改它指向的内容;- 在类中, const 成员函数是一个重要的概念。4).如果两个函数名相同,参数相同,但是一个是常函数一个是非常函数,那么这两个函数为函数重载,非常对象优先调用非常函数,常对象只能调用常函数。

2401_88249494的博客 2263

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++ | C++中与const相关的权限放大和缩小详解

const。

TTKunn的博客 1805

C/C++中CONST的意义

const 关键字来声明某个常量字段或常量局部变量。 常量字段和常量局部变量不是变量并且不能修改。 常量可以为数字、布尔值、字符串或 null 引用。 采用符号常量写出的代码更容易维护;指针常常是边读边移动,而不是边写边移动;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替) 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名 常对象: 类名 const 对象名 常成员函数: 类名::fun(形参) const

zhou_VisualStudio 的博客 2312

c++的const总结(转)

原因如下:如果返回值为某个对象为const(const A test = A实例)或某个对象的引用为const(const A& test = A实例),则返回值具有const属性,则返回实例只能访问类A中的公有(保护)数据成员和const成员函数,并且不允许对其进行赋值操作,这在一般情况下很少用到。调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const A*a,则不能对传递进来的指针的内容进行改变,保护了原指针所指向的内容;

A19720252059的博客 1273

【C++】const详解

常量概念是为了使程序员能够在变和不变之间画一条界限。给C++程序设计项目中提供了安全性和可控性。——《C++编程思想》 在编程中要尽可能多的使用const,这样可以获得编译器的帮助,以便写出健壮性的代码。  define宏定义,可以将常量赋值给一个变量,但由于在编译过程中只是简单的进行文本替换,并不会对赋值语句进行检查,因此会存在很多潜在的威胁,一旦定义出错,整个调用过程也讲出错。所以C+...

Twinkle 1467

C++常量定义:const与#define终极对比

const是 C++ 的关键字,用于声明一个 “只读变量”—— 即定义后值不可修改的变量。它属于 C++ 的类型系统一部分,具有严格的类型检查和明确的作用域。#define是 C/C++ 的预处理指令,用于定义 “宏常量”—— 本质是文本替换规则,在预处理阶段(编译前)会将代码中所有宏名替换为指定的文本,不涉及类型检查。

a278518581的博客 1105
上一篇: 【C++】二、指针数组与数组指针
下一篇: 【C++】四、重载,重写,重定义
左耳听风
博客等级 码龄12年 325粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值