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*定义常量字符串,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,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。