c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

news/2024/4/19 3:55:48/文章来源:https://blog.csdn.net/weixin_46838716/article/details/130358455

c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格

2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c++的话,
我所知道的周边的会c++的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg
提示:系列c++学习的基础和高阶知识,用于公司生产实践中,实实在在的公司部署产品要用的,因为c++速度快,
而java和Python速度慢,自然往硬件里面部署算法啥的,都得用c++或者c,因此本科学的c很重要,后来的Python或者java就没有那么重要了,
c/c++系列文章:
【1】c++:c语言优缺点,visual studio2019如何新建项目,写hello world程序
【2】c/c++:gcc安装,gcc编译hello world文件,system函数调用系统命令,sleep函数
【3】linux下gcc的编译过程和功能,预处理,编译,汇编,链接,.c预处理为.i文件.s文件.o文件.exe文件
【4】c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键
【5】c/c++:数据类型,常量变量,标识符,有符号整型,无符号unsigned,字符类型,字符串类型,实数类型,浮点型,科学计数法
【6】c/c++:2进制、8进制、10进制、16进制和进制之间的转换,c语言输出匹配格式%
【7】c/c++:原码,反码,补码和常见的数据类型取值范围,溢出
【8】c/c++:类型限定符,printf输出格式,putchar,scanf,getchar
【9】c/c++:算术运算符,赋值运算,逻辑运算,比较运算,三目运算,逗号运算,数据类型转换
【10】c/c++:顺序结构,if else分支语句,do while循环语句,switch case break语句
【11】c/c++:for循环语句,分号不可省略,表达式可以省略,猜数字游戏,跳转语句continue,break,避免写goto
【12】c/c++:一维数组,初始化数组,循环打印数组,计算数组存储空间,数组元素个数,数组逆序算法
【13】c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
【14】c/c++:visual studio的代码快捷键,VS设置自定义默认代码,使用快捷键
【15】c/c++:三维数组,字符数组和字符串,统计字符串中字符出现的频次,scanf输入空格,正则匹配表达式
【16】c/c++:gets(),fgets(),puts(),fputs(),strlen(),字符串拼接函数
【17】c/c++:函数的作用,分类,随机数,函数定义,调用,申明,exit()函数,多文件编程,防止头文件重复
【18】c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
【19】c/c++:万能指针,泛型指针,const int *p,int const *p,int *const p,const int *const p,指针与数组,p++,
【20】c/c++:指针p+p-p*p/,数组&a+1,指针减指针,指针实现strlen函数,指针的比较运算,指针数组,多级指针
【21】c/c++:栈帧,传值,传址,实参传值给形参,传地址指针给形参
【22】c/c++:数组做函数参数,传入函数的首地址,相当于传址,指针做函数返回值,数组止做c语言中函数的返回值


文章目录

  • c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格
    • @[TOC](文章目录)
  • c/c++:指针和字符串
  • 当字符串(字符数组)做函数的参数时,传入地址,但不需要提供长度,骚啊
  • c语言手撕代码比较俩字符串大小:strcmp()函数
  • 字符串拷贝函数strcpy()函数
  • 字符串中找到特定字符ch
  • 去掉字符串中的空格,去空格函数
  • 总结

c/c++:指针和字符串

字符串定义,就是字符数组

char ch[]={'a',a='b','\0'};
char ch[]="ab";
char* ch="ab";//数组就是指针,懂?所以就多出一种定义方法来

不过呢,它存了字符串的首个字符地址
而且不需要解引用就能打印这个玩意

他们仨都是定义的字符数组,数组即指针,可以%s直接打印

void f80(void)
{char str1[] = "hello\n";//printf没区别--字符串变量,可修改char* str2 = "hello\n";//定义的是字符串常量,不可修改printf("%s", str1);printf("%s", str2);str1[0] = 'R';str2[0] = 'R';//ggprintf("%s", str1);printf("%s", str2);
}int main(void)
{f80();system("pause");return 0;
}

在这里插入图片描述

char* p=“字符串”;
它可以直接%s打印,因为它保存了数组的首地址,数组首地址也是%s直接打印的
所以就不用解引用了

OK

而char*
定义的是字符串常量,不可修改哦!!!


void f80(void)
{char str1[] = "hello";//printf没区别--字符串变量,可修改char m[] = "hello";//printf没区别--字符串变量,可修改char* str2 = "hello";//定义的是字符串常量,不可修改char* n = "hello";//定义的是字符串常量,不可修改printf("%s\n", str1);printf("%s\n", m);printf("%s\n", str2);printf("%s\n", n);//看他们的地址printf("%p\n", str1);printf("%p\n", m);printf("%p\n", str2);printf("%p\n", n);
}

在这里插入图片描述
发现了啥,如果是字符数组字符串变量
那地址不同
但是字符串常量char*
他们的地址一样,不管你用啥来指着它

在这里插入图片描述
变量可读可写
常量只可以读

在这里插入图片描述

当字符串(字符数组)做函数的参数时,传入地址,但不需要提供长度,骚啊

因为每个字符串都有\0结束标记
咱们可以通过\0配合指针来求哦

c语言手撕代码比较俩字符串大小:strcmp()函数

挨个字符比
str1大于str2的话,返回1
str1小于str2的话,返回-1

比较ASCII码
在这里插入图片描述
在这里插入图片描述
z大
咱们一个个比,只要不等,返回

strcmp(str1,str2);


void f81(void)
{char str1[] = "hello";//printf没区别--字符串变量,可修改char str2[] = "hello";//printf没区别--字符串变量,可修改printf("%d\n", strcmp(str1,str2));//相等返回0
}int main(void)
{f81();system("pause");return 0;
}

在这里插入图片描述
自己手撕代码呢?


int mystrcmp(char* str1, char* str2);void f81(void)
{char str1[] = "hello";//printf没区别--字符串变量,可修改char str2[] = "hella";//printf没区别--字符串变量,可修改printf("%d\n", strcmp(str1,str2));//相等返回0printf("%d\n", mystrcmp(str1,str2));//相等返回0
}int mystrcmp(char* str1, char* str2)
{int i = 0;//索引while(1){if (str1[i] == '\0' && str2[i] == '\0') return 0;else if (str1[i] != '\0' && str2[i] == '\0'){return 1;//str1更长}else if (str1[i] == '\0' && str2[i] != '\0'){return -1;//str2更长}else if (str1[i] == str2[i]){i++;//字符相同不管}else if (str1[i] > str2[i]) return 1;else return -1;}}int main(void)
{f81();system("pause");return 0;
}

在这里插入图片描述
自己写就要搞清楚,当俩不等长怎么处理
然后考虑字符大小比较,好说

如果是等长的话好说
三目运算即可

在这里插入图片描述
\0是很小的
如果你另外一个长的
可能下面的三目运算符直接就可以对比哦

牛逼的算法就是先沟通想清楚,即使不等长,另一个字符也是和\0比
所以可以节约很多代码


int mystrcmp2(char* str1, char* str2)
{int i = 0;while (str1[i] == str2[i]){//相等就不管,i++if (str1[i] == '\0') return 0;//结束了就整体等i++;//不等出去看三目}return str1[i] > str2[i] ? 1 : -1;//大不大
}

在这里插入图片描述
这种代码简单又好理解
如果你不用数组操作
而是解引用
直接操作指针呢?
不要i了


int mystrcmp3(char* str1, char* str2)
{while (*str1 == *str2)//直接这个地址解引用,这个字符等吗{//相等就不管,i++if (*str1 == '\0') return 0;//结束了就整体等str1++;//不等出去看三目str1++;//不等出去看三目}return *str1 > *str2 ? 1 : -1;//大不大
}

在这里插入图片描述
绝对牛逼
反正都能实现
数组和指针本质一样
只不过一个是取,一个是解引用

在这里插入图片描述

字符串拷贝函数strcpy()函数

在这里插入图片描述
在这里插入图片描述
很简单


void mystrcpy(char* str2, char* str1);
void f82(void)
{char str1[] = "hello";//printf没区别--字符串变量,可修改char str2[] = "hella";//printf没区别--字符串变量,可修改char str3[] = "hella";//printf没区别--字符串变量,可修改strcpy(str2, str1);//str1拷贝给str2mystrcpy(str3, str1);//str1拷贝给str2printf("%s\n", str2);printf("%s\n", str3);
}void mystrcpy(char* str2, char* str1)
{int i = 0;while (1){str2[i] = str1[i];if (str1[i] == '\0') break;//直到结束i++;//别忘了}
}int main(void)
{f82();system("pause");return 0;
}

在这里插入图片描述

指针操作也行


void mystrcpy2(char* str2, char* str1)
{while (1){*str2 = *str1;if (*str1 == '\0') break;//直到结束str1++;//别忘了str2++;//别忘了}
}

在这里插入图片描述

字符串中找到特定字符ch


char* strpos(char* str1, char ch)
{//字符串中找字符的位置while (*str1){//结束是0,if (*str1 == ch) return &str1;//此刻指针的位置str1++;//否则挪动}return NULL;
}void f83(void)
{char str1[] = "hello";//printf没区别--字符串变量,可修改char ch = 'o';char* res = strpos(str1, ch);printf("%p\n", res);printf("%d\n", '\0');
}

在这里插入图片描述
这是返回地址咯
但是返回它的元素下标呢?


int strpos2(char* str1, char ch)
{char* p1 = str1;//字符串中找字符的位置while (*str1){//结束是0,if (*str1 == ch) return str1 - p1;//相对位移str1++;//否则挪动}return -1;
}

在这里插入图片描述

这不很简单吗?
就是用指针偏移量来反应o的位置

去掉字符串中的空格,去空格函数

空格就不复制了

在这里插入图片描述
在这里插入图片描述
反正,申请一个和原始串str1的长度的字符串,然后我们copy即可

我写这个去空格函数空间负责度o(1),时间复杂度o(n)
我不需要另起一个空间,只需要利用ij前后错位关系搞定
反正有空格i++
不会影响j


char* strno_(char* str)
{//咱们就在这一个字符串上操作,原串肯定长一点int i = 0;int j = 0;while (str[i]){if (str[i] == ' ') i++;//去掉空格else{str[j++] = str[i++];//否则后往前copy}}//最后别忘了给strj加\0str[j] = '\0';return str;
}void f84(void)
{char str1[] = "h ello";//printf没区别--字符串变量,可修改char* res = strno_(str1);printf("%s\n", res);
}

在这里插入图片描述


总结

提示:重要经验:

1)
2)学好c++,即使经济寒冬,手握10个大厂offer绝对不是问题!
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103693.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫基础之二

Python爬虫基础包括HTTP协议、HTML、CSS和JavaScript语言基础、requests库的使用、Beautiful Soup库的使用、xpath和正则表达式的使用等。此外,还应该了解反爬虫机制和爬虫的一些常见问题及解决方法。 上一篇文章讲解了有关条件判断语句、循环语句等相关知识&#…

陆奇-奇绩创坛-chatGPT新范式,新时代,新机会

奇绩创坛-新范式,新时代,新机会 01-新范式 新范式的新拐点 新范式的历史环境 新范式的社会影响 新范式的缔造者:Sam Altman和OpenAI 新范式的动力引擎 新范式的演化路径 02-新时代 新时代的宏观发展格局 新时代的中国机会 新时代的OpenAI生…

IT项目管理之软件测试

1. 定义 软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前,要经过一系列的严格测试,才能保证交付质量。 2. QC & QA &a…

开源模型ModelScope的初探使用

泛AI开发者的一站式模型服务产品平台 阿里达摩院推出了一个开源的模型共享平台,包括计算机视觉、多模态、自然语言处理等多个领域上手即用的模型,如果AI相关模型感兴趣的同学,或者想基于基础模型做业务场景的同学,都可以用这个平…

C++三大特性—继承 “访问控制”

本文主要阐述关于C继承中基类与派生类之间的访问关系 继承方式与访问方式 继承定义格式: 派生类可以继承定义在基类的成员,但是派生类的成员函数不一定有权访问从基类继承来的成员    访问限定符的作用:控制派生类从基类继承而来的成员是否…

学习系统编程No.23【信号实战】

引言: 北京时间:2023/4/23,最近学习状态不怎么好,总是犯困,没精力的感觉,可能是病没有好彻底的原因,也可能是我内心因为生病而认为摆烂理所应当,反正最后导致摆烂,课现在…

android之 Launcher改造仿桌面排版的效果

一,背景 1.1 新接手一个灯光控制项目,其页面和效果还是比交复杂的,其中一个功能就是仿苹果桌面来排版灯具,支持拖拽,分组,分页。 拖动图标的时候判断是否空白位置还是已经有占位了,有的话就把…

体验了多款国产类ChatGPT产品后,我选择了道合顺的【ChatIC】

💂作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言A…

springboot实用配置

springboot实用配置 (一)打包与运行(二)配置高级1.临时属性设置2.配置文件分类3.自定义配置文件 (三)多环境开发(四)日志1.日志基础2.日志输出格式控制3.日志文件 (一&am…

14、RPC与gRPC

目录 一、rpc基础1 - rpc入门2 - 基础的rpc通信3 - 基于接口的RPC服务 二、rpc编码1 - gob编码2 - json on tcp3 - json on http(待补充) 三、prtotobuf编码1 - prtotobuf概述2 - protobuf编译器3 - 序列化和反序列化4 - 基于protobuf的RPC(待…

vue项目 解决el-table自适应高度,vue页面不显示多条滚动条,超出的部分让el-table内部出现滚动条(推荐使用第二种解决方案)

一、需求 后台管理系统:最常见的页面都是由—>左侧菜单、头部tabView页签、主体数据渲染页面(AppMain);而一般AppMain页面又分为: 搜索区域、table数据(分页),可能也会存在底部&a…

QGIS数据可视化学习笔记01——一般的图层样式调整和在地图上添加图表

说明:QGIS数据可视化章节用的数据为QGIS绘制一张地图学习章节的数据,传送门:https://blog.csdn.net/qq_47188967/article/details/130196284 一、 一般的图层样式调整 首先呢,在QGIS中打开上一章节用的数据,界面如下&…

基于飞桨 PaddleVideo 的骨骼行为识别模型 CTR-GCN

main.pysame_seedsparse_argsmain ensemble.pyconfigs 文件夹Joint(J)的配置文件ctrgcn_fsd_J_fold0.yamlctrgcn_fsd_J_fold1.yaml Joint Angle(JA)的配置文件ctrgcn_fsd_JA_fold0.yaml paddlevideo 文件夹utils 文件夹__init__.p…

MATLAB符号运算(七) 更新中...

目录 1、实验目的: 2、实验内容: 1、实验目的: 1)掌握定义符号对象和创建符号表达式的方法; 2)掌握符号运算基本命令和规则; 3)掌握符号表达式的运算法则以及符号矩阵运算&#xf…

[JavaEE初阶] 类加载机制

在真正的战争到来之前,尽可能地变得强大吧~ 文章目录 前言1. 类加载1.1 类加载的过程1.2 类加载的时机1.3 双亲委派模型 前言 这个问题是面试经典题,让我们来求甚解吧~ 1. 类加载 1.1 类加载的过程 如下图 加载,找到.class文件,读取文件内容验证,验证.class文件的格式是否…

SQL优化(3):order by优化

MySQL的排序,有两种方式: Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index :…

Spring lettuce读写分离

Redis 的 Sentinel 模式默认配置下 Redis 的客户端只对 Master 读写,另外2个Slave闲置。若主从节点在不同机房,在读取时会有跨机房的网络时延,并且比同机房访问更容易发生网络丢包。故在一些场景可以考虑将跨机房的服务节点设置为读写分离 Re…

Python中 re.findAll()、re.sub()、set()的使用

1. re.findall() re.findall():函数返回包含所有匹配项的列表。返回string中所有与pattern相匹配的全部字串,返回形式为list / 数组。 由函数原型代码可知,findall() 函数存在三个参数: 1. pattern:正则表达式中的 ‘模…

Opencv+Python笔记(五)图像阈值化处理

图像阈值化可以理解为一个简单的图像分割操作,阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的像素点使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。 阈值处理有2种方式,一种是固…

订单交期迟滞,销售回应慢,怎么解决客户问题?

按客户定制产品订单,进行报价和生产的制造企业,有拆解图纸生成物料BOM的工序,通常由企业产品设计部门的拆图员岗位专门负责。 手工制作BOM数据,准确性低 拆图员肉眼查看每页图纸中的表格数据,手动敲键盘填入到企业要…