【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

OpenFOAM算例文件结构深度解析:以cavity案例为例教你读懂每个文件夹的作用

本文以OpenFOAM经典cavity案例为例,深度解析CFD算例文件结构。详细阐述了0、constant、system三个核心目录的作用:0存放初始与边界条件,constant定义物理属性和网格,system控制求解策略。通过剖析关键文件,帮助用户理解每个参数的意义,掌握从读懂到定制算例的能力,为高效使用这一开源CFD工具奠定坚实基础。

beer8的博客 238

经典算法之——解决全排列问题以及详解

回溯”指的是“状态重置”,可以理解为“恢复现场”,是在编码的过程中,是为了节约空间而使用的,而在递归或者深度优先中根据需要的场合来配合回溯法可以进一步对自己的代码进行优化。, n-1, n},方向都为向左。邻位对换法是全排列生成算法中的其中一种,它的换位是双向的,通过保存数字的“方向性”来快速得到下一个排列。最后以 3 开头的全排列为[3, 1, 2], [3, 2, 1];以 1 开头的全排列为[1, 2, 3], [1, 3, 2];以 2 开头的全排列为[2, 1, 3], [2, 3, 1];

m0_68987535的博客 8794

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

图自编码器(GAE)与变分图自编码器(VGAE)

在学习图自编码器之前先了解一下自编码器与变分自编码器。

小鱼的小窝 1万+

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

国税局发票查验中英文验证码识别最新版,识别率99.9%

采用深度学习进行发票查验验证码模型的训练,在我电脑上模型训练的环境如下: 显卡:RTX 2080TI tensorflow-gpu:2.5.3 1 训练集和测试集的准备 发票查验的验证码分为4种类型,分别为黑色、红色、黄色、蓝色,经过我的测试,采用4个模型的效果最好,每个模型对应识别一种类型的验证码。 首先我们4种类型的验证码都准备10万张。 00黑色类型的验证码: 01红色类型的验证码: 02黄色类型的验证码: 03蓝色类型的验证码: 验证码图像图像准备好后,对其进行标记,也就是对验证码重命名:

Keras深度学习 83万+

D2D与C2C高速互联技术对比:从封装到性能的全面解析

本文全面解析了Die-to-Die(D2D)与Chip-to-Chip(C2C)高速互联技术的差异,从封装形式、传输距离到性能指标进行深度对比。D2D技术在带宽、延迟和能效方面具有显著优势,适用于高性能计算和AI加速;而C2C技术则更适合车载电子系统等长距离传输场景。文章还探讨了UCIe标准化趋势,并提供了技术选型的实用建议。

weixin_29197051的博客 553

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

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 728

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

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

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

Python分布式爬虫深度实战:反爬破解+数据清洗+性能优化全流程

分布式爬虫的核心是“调度中心化+执行分布式”,Scrapy-Redis是最易落地的框架,无需从零写调度逻辑;反爬破解要分级应对:基础反爬靠随机UA/限流,进阶反爬靠代理池,高级反爬靠第三方验证码API;数据清洗的关键是“批量处理+标准化”,避免内存溢出,核心字段去重和异常值过滤是必做步骤;性能优化不是单纯加节点,而是从架构(分片)、代码(批量写入)、服务器(索引/网络)三层协同优化,才能实现效率翻倍。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1200

Python爬虫-爬取猫眼演出数据

本文是该专栏的第53篇,后面会持续分享python爬虫干货知识。猫眼平台除了有影院信息之外,它还涵盖了演出信息,比如说“演唱会,音乐节,话剧音乐剧,脱口秀,音乐会,戏曲艺术,相声”等等各种演出相关信息。而本文,笔者将以猫眼平台为例,基于Python爬虫实现获取各种演出信息的数据。废话不多说,具体细节部分以及详细思路逻辑,笔者将在正文结合完整代码进行详细说明。(附带完整代码)

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 568

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

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

码事漫谈 1560

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++中的const_c++ const变量

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

2401_84240431的博客 968

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C/C++中的const

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

2401_88249494的博客 2263

OV9734 DATASHEET,完整规格书

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

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

余额充值