当前位置: 首页 > news >正文

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

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,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

相关文章:

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

c/c:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所…...

2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布

2023年4月23日,据DAMA中国官方信息,目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有:北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中,打算6月考试的朋友们可以抓紧时间报名啦…...

UDS的0x19服务介绍

什么是 UDS? UEI (Unified Diagnostic Services,统一诊断服务) 是一种在车辆电子控制单元 (ECU) 之间交换诊断信息的标准通信协议,它是OBD-II的某些扩展。利用 UDS 协议,诊断工程师可以访问车辆的各种功能,如读取故障…...

QinQ技术与Portal技术

QinQ 802.1Q-in-802.1Q,是一种扩展VLAN标签技术。在城域网中,需要大量的VLAN来隔离区分不同的用户,但是原有的802.1Q只有12个比特,仅能标识4096个VLANQinQ即在802.1Q的基础上,再增加一层外层标签。使得可以标识4096*40…...

Vue-自定义表单验证(rule,value,callback)详细使用

前言 最近在实际开发中遇到需要验证合同编号是否在数据库已经存在,自定义表单验证。 的表单验证大家都知道form绑定rules,prop绑定值与form.值一样,必填,失去焦点触发 提示信息。 今天我们讲一讲自定义验证规则具体使用场景和它…...

港联证券|TMT板块全线退潮,这些个股获主力逆市抢筹

计算机、电子、传媒、通讯职业流出规模居前。 今天沪深两市主力资金净流出709.92亿元,其中创业板净流出218.36亿元,沪深300成份股净流出187.92亿元。 资金流向上,今天申万一级职业普跌,除了国防军工职业小幅上涨,获主…...

WPF学习

一、了解WPF的框架结构 (第一小节随便看下就可以,简单练习就行) 1、新建WPF项目 xmlns:XML的命名空间 Margin外边距:左上右下 HorizontalAlignment:水平位置 VerticalAlignment:垂直位置 2…...

C#使用WebDriver模拟浏览器操作WEB页面

有时候需要模拟访问页面触发某个功能,可以使用WebDriver来实现这一功能,驱动打开浏览器,并对页面重定向以及对页面写入脚本等操作。 安装Selenium.Chrome,Selenium.Support.UI,Selenium 引入 using OpenQA.Selenium.…...

正则表达式 - 简单模式匹配

目录 一、测试数据 二、简单模式匹配 1. 匹配字面值 2. 匹配数字和非数字字符 3. 匹配单词与非单词字符 4. 匹配空白字符 5. 匹配任意字符 6. 匹配单词边界 7. 匹配零个或多个字符 8. 单行模式与多行模式 一、测试数据 这里所用文本是《学习正则表达式》这本书带的&a…...

银行数字化转型导师坚鹏:银行数字化转型培训方案

目录 一、银行数字化转型培训背景 二、银行数字化转型模型 三、银行数字化转型课程设计思路 四、 银行数字化转型课程基本介绍 五、 银行数字化转型课程设置 六、银行数字化转型课程大纲 七、培训方案实施流程 一、银行数字化转型培训背景 2020年1月3日&#xff…...

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测

多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测 目录 多维时序 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积神经网络-长短期记忆网络多变量时间序列预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-…...

Shell知识点(一)

1.echo 命令 echo命令的作用是在屏幕输入一行文本&#xff0c;可以降该命令的参数原样输出。 $ echo hello world hello world 如果想要输出的是多行文本&#xff0c;包含换行符&#xff0c;这时就需要把多行文本放在引号里面 $ echo "<HTML><HEAD><TITLE…...

mysql 索引失效、联合索引失效场景和举例

索引失效 假设有一张user 表&#xff0c;表中包含索引 (id); (name); (birthday); (name,age); 对索引字段进行函数操作 select name from user where year(birthday) 2000;使用模糊查询&#xff0c;查询中使用通配符 select name from user where name like %益达%;使用i…...

快速将PDF转换为图片:使用在线转换器的步骤

PDF文件是一种常见的文档格式&#xff0c;但在某些情况下需要将其转换为图片格式&#xff0c;例如将PDF文件插入PPT演示文稿中。此时&#xff0c;使用在线PDF转换器是一种快速且简便的方法。 本文将介绍如何使用在线转换器将PDF文件转换为图片格式。 步骤1&#xff1a;选择合…...

什么是gpt一4-如何用上gpt-4

怎么使用gpt-4 目前GPT-4还未正式发布或公开&#xff0c;因此也没有详细的对接说明。但是我们可以根据GPT-4的前身GPT-3的应用经验&#xff0c;以及GPT-4的预期功能推测一些可能的使用步骤&#xff1a; 选择适合的GPT-4实现技术&#xff1a;GPT-4可能有不同的实现技术&#xff…...

Docker 相关概念

1、Docker是什么&#xff1f; 如何确保应用能够在这些环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f; 答案就是使用容器。Docker之所以发展如此迅速&#xff0c;也是因为它对…...

STM32平衡小车 TB6612电机驱动学习

TB6612FNG简介 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 VM电…...

动态加载 JS 文件

动态加载JS文件是指在网页运行过程中通过JavaScript代码向页面中动态添加外部JS文件&#xff0c;这种方式能够提高页面加载速度和用户体验&#xff0c;并且可以帮助网站实现更多的功能和特效。 本文将详细介绍动态加载JS文件的基本原理、优势、注意事项以及具体实现方法&#…...

14、lldb调试指令

LLDB LLDB(Low Lever Debug): 默认内置于Xcode中的动态调试工具.标准的lldb提供了一组广泛的命令,旨在与老版本的GDB命令兼容.除了使用标准配置外,还可以很容易地自定义lldb以满足实际需要. 1.1 lldb语法: <command> [<subcommand> [<subcommand>...]] &l…...

浏览器缓存策略:强缓存和协商缓存

浏览器缓存&#xff1a;其实就是在本地使用的计算机中开辟一个内存区&#xff0c;同时也开辟一个硬盘区&#xff0c;作为数据传输的缓冲区&#xff0c;然后利用这个缓冲区来暂时保护用户以前访问的信息通常浏览器的缓存策略分为两种&#xff1a;强缓存和协商缓存&#xff0c;强…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...