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

news2024/10/6 16:47:14

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';//gg

    printf("%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));//相等返回0
    printf("%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拷贝给str2
    mystrcpy(str3, str1);//str1拷贝给str2
    printf("%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加\0
    str[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.coloradmin.cn/o/463745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《基于深度迁移学习的可穿戴睡眠阶段分类》阅读笔记

一、摘要 佩戴可穿戴设备进行睡眠监测是一种无创、便捷的方法,可以提高睡眠障碍筛查和健康监测的效率。然而,由于缺乏大规模、标准化的PPG数据集,使用PPG进行睡眠阶段分类仍然具有挑战性。本文提出了一种基于深度迁移学习的方法来解决这个问…

类对象的大小---this指针

如何计算类对象的大小 问题:类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?如何计算一个类的大小? 类对象的存储方式 只保存成员变量,成员函数存放在公共的代码段 结论&#xf…

不得不说的结构型模式-装饰器模式

目录 装饰器模式是什么 下面是装饰器模式的一个通用的类图: 以下是使用C实现装饰器模式的示例代码: 下面是面试中关于桥接器模式的常见的问题: 下面是问题的答案: 装饰器模式是什么 装饰器模式是一种结构型设计模式&#xff…

数据分析中常见标准的参考文献

做数据分析过程中,有些分析法方法的标准随便一搜就能找到,不管是口口相传还是默认,大家都按那样的标准做了。日常分析不细究出处还可以,但是正式的学术论文你需要为你写下的每一句话负责,每一个判断标准都应该有参考文…

一步一步教你部署hexo博客网站

先看效果: 目录 一、官网 二、安装Git和Node(最好是最新版本) 三、找个放项目的地方:新建一个文件夹 hexo并在该目录下执行命令 四、用WebStorm打开hexo文件夹 五、启动项目 六、打包(如果重复打包,每次打包之前&#xff0c…

学电路设计时,你遇到过什么有趣的事?

说几个学生时代的傻x事: 1、以前对DC-DC懂得少,而且一般开关电源芯片小,还有一堆外围,手焊很麻烦,就觉得三端稳压器碉堡了啊,一个就能得到想要的电压啊,有木有。然后就各种用三端稳压器。那玩意…

音频处理库大PK:四种主流库在计算mel频谱时性能如何?

目录 介绍测试脚本注意警告 性能Linux - AMDLinux - IntelmacOS - IntelmacOS - M1 总结 介绍 音频信号处理在各种应用中都发挥着重要的作用,如语音识别、音乐信息检索、语音合成等。其中,Mel频谱是一种常用的频域特征表示方法,用于描述人类…

【Hello Network】网络编程套接字(四)

作者:小萌新 专栏:网络 作者简介:大二学生 希望能和大家一起进步 本篇博客简介:简单介绍下TCP通讯过程 文章目录 简单的TCP英译汉服务器更改handler方法 地址转换函数字符串转化整型IP整数IP转化字符串 绑定失败问题TCP协议通讯流…

贪吃蛇小游戏(C++)

首先我们需要下载EasyX(具体的方法在EasyX专栏中有提到) easyX下载和绘制简单基本图形_小梁今天敲代码了吗的博客-CSDN博客 贪吃蛇这个游戏我们一定都玩过,玩家使用方向键操控一条“蛇”,蛇会朝着一个方向不断移动,玩…

主成分分析

一、案例与数据 某研究者对企业员工进行调查,并且制定了一份问卷,研究者想要将问卷中的多个量表题进行浓缩以便后续分析,比如休假制度、资金制度、工资水平或者晋升制度等等,其中部分数据如下: 二、分析问题 其实想要…

时序预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间序列预测

时序预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间序列预测 目录 时序预测 | MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现WOA-BiLSTM鲸鱼算法优化双向长短期记忆网络时间…

前端已死还是“娱乐至死”?做个清醒的前端

目录 一、前言 二、为什么会出现“前端已死”的观点? 1、技术变化太快: 2、前端工程化带来的挑战: 3、新技术的崛起: 三、前端该如何提升自己 1、学习新技术: 2、掌握前端工程化: 3、参与社区和开…

远程网关桥接模式实现同一局域网组网管理(Superlink)

远程网关桥接模式配置介绍及示例 功能简述 智联物联远程网关桥接模式,是指电脑侧Superlink远程工具及前端ZP网关通过4G/WAN/WiFi客户端等方式分别接入互联网及后端服务器平台远程服务后,再借助虚拟网卡桥接技术,先由服务器平台下发桥接网络参…

室内定位之5G定位

一、前言 随着5G通信基础设施逐步完善,5G网络的优势一方面在于其具有的更大的带宽和子载波间隔,使得5G室内定位精度提升(3.5GHz频段下定位精度在5米左右,毫米波定位精度可以达到3米或更高),相对于其他定位技术,已建成…

解决docker启动mysql无法输入中文以及中文不显示或乱码问题

前言 我在使用MySQL时,遇到了两个问题。一是在插入中文数据时,无法输入中文。二是在select的时候,查出来的中文数据是空的(因为插入时为空),然后我就使用Navicat连接数据库添加了中文数据,再到…

【MySQL】联合查询子查询以及合并查询的使用

目录 上篇在这里喔~ GROUP BY分组子句与联合查询的使用详解 联合查询步骤 1.自连接 1.查询每位同学的计算机原理和Java的成绩 2.显示所有计算机原理成绩比java成绩高的成绩信息 2.子查询 1.单行子查询 1.查询’许仙‘的同班同学 2.多行子查询 1.查询语文或英语课程的…

综合管廊智慧运维管理平台应用研究

摘要:为提升综合管廊运维管理水平,实现管理的数字化转型,采用综合监测系统、BIMGIS 可视化系统、智能机器人巡检、结构安全监测等技术,搭建实时监控、应急管理、数据分析等多功能为一体的智慧管廊运维管理平 台,为综合…

Python爬虫基础之二

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

stm32串口中断流程

NVIC简介 内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC) 硬件发生中断后,相关电信号会触发内核跳转中断向量表查找中断函数, 中断向量名查于汇编文件startup_stm32xxx.s文件 从本质上说这里就是数字电路的组合形成的一系列行为,当相关中断的寄存…

一键汇总——高效电脑检索方案

文件检索和分类对于电脑内部的文件检索非常重要,因为它们可以帮助用户快速找到需要的文件。在电脑内部,文件通常被分类存储在不同的分区中,这有助于管理员更好地组织和查找文件。对于分区资源整合,以下是一些建议: 了…