c/c++:字符串str中寻找子串substr出现的次数
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语言中函数的返回值
 【23】c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格
 【24】c/c++:带参数的main函数,int main(int argc, char* argv[]),main(int argc, char** argv),error c99是因为c版本过低
 
  
  文章目录
 
  - c/c++:字符串str中寻找子串substr出现的次数
 - @[TOC](文章目录)
 
 
   - 在字符串str中,找substr出现的位置
 - c/c++:字符串str中寻找substr出现的次数
 - 复习最近的东西
 - 总结
 
 
 
 
文章目录
- c/c++:字符串str中寻找子串substr出现的次数
 - @[TOC](文章目录)
 
- 在字符串str中,找substr出现的位置
 - c/c++:字符串str中寻找substr出现的次数
 - 复习最近的东西
 - 总结
 
在字符串str中,找substr出现的位置
在str中,找str出现的位置
 俩参数
 char* str
 char* substr
 返回int,即substr在str中出现的位置
这玩意上一节我说过的哦
 【23】c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格
寻找指定字符串的位置

 它只返回第一次匹配成功的地方
这个玩意呢?
 是非常非常难的一个算法
 叫kmp算法,我之前说过的
 KMP算法:在字符串s中搜索匹配查找match字符串,如果能找到返回首个匹配位置i,否则返回-1
不过当时我们是优化代码
 如果说LeetCode的话,它标记为easy了
 它不需要优化
我们今天讲不需要优化的代码
返回子串在原串中的位置,地址,或者下标
 都OK
在c语言中strstr函数就是干这件事的
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>
void f85(void)
{
    char* ans = strstr("hello", "llo");
    printf("%s\n", ans);//有结果应该是一个字符串,没有就null
}
//带参数的main
int main(int argc, char* argv[])
{//固定的形式
    for (size_t i = 0; i < argc; i++)
    {
        printf("%s\n", argv[i]);//反正这些参数都能看的
    }
    f85();
    system("pause");
    return 0;
}
 

 懂吧
 咱们可以利用这个函数,继续完成下面的任务
 这好说

 注意,它返回的位置是第一个匹配上的,所以整个str后续一段字符串都会展示给我们哦
c/c++:字符串str中寻找substr出现的次数
俩参数
 char* str
 char* substr
 返回int 个数,substr的个数
有了strstr函数
 那么我们很清楚,strstr返回了substr的位置,我们从这个位置,后面继续找下一个
比如
 hellollolllo
 llo
 自然它就会第一次返回这个
 
所以我们要继续拿着这个返回的串,去找llo
 如果返回null说明再也没有了
注意,中间得到一个结果后,需要把llo去掉
 
 否则永远死循环在那寻找llo
int strCount(char* str, char* substr)
{
    char* ans = strstr(str, substr);
    //printf("%s\n", ans);//有结果应该是一个字符串,没有就null
    int k = 0;//统计
    int len = strlen(substr);
    while (ans)
    {
        k++;//只要ans不空就可以
        ans = strstr(ans+len, substr);
    }
    return k;
}
void f86(void)
{
    char* str= "hellollollo";
    char* substr = "llo";
    int k = strCount(str, substr);
    printf("%d\n", k);
}
int main()
{//固定的形式
    f86();
    system("pause");
    return 0;
}
 

 这样就搞定了
关键就在,你返回llollollo后
 需要把第一个llo干掉
 只需要ans指针挪动一下即可,长度是llo的长度
 这样就不会重复查找了
后来可能java就根据这个搞了个substr函数,截取子串,本质就是c的指针操作
复习最近的东西
今后经常会用栈帧的概念
 
 
 后续我们还会将这些

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



















