您现在的位置是:首页 >其他 >c/c++:字符串长度strlen,字符串转置,反转,判断字符串是否是回文串,strcpy,strcat,strcmp,sprintf,sscanf,查找strchr,strrchr,strstr网站首页其他

c/c++:字符串长度strlen,字符串转置,反转,判断字符串是否是回文串,strcpy,strcat,strcmp,sprintf,sscanf,查找strchr,strrchr,strstr

冰露可乐 2023-06-20 20:00:03
简介c/c++:字符串长度strlen,字符串转置,反转,判断字符串是否是回文串,strcpy,strcat,strcmp,sprintf,sscanf,查找strchr,strrchr,strstr

c/c++:字符串长度strlen,字符串转置,反转,判断字符串是否是回文串,strcpy,strcat,strcmp,sprintf,sscanf,查找strchr,strrchr,strstr

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版本过低
【25】c/c++:字符串str中寻找子串substr出现的次数


c/c++:求非空字符串的元素个数

字符串
aaa bbb c dd
“”空串
非空就是有一个字符串即可

那不就是求strlen吗
看结束即可


int mystrlen3(char* str)
{
    int k = 0;
    while (*str)
    {
        k++;
        str++;
    }

    return k;
}

void f88(void)
{
    char* str = "hello hhh";
    printf("%d
", mystrlen3(str));
}

int main()
{//固定的形式

    f88();

    system("pause");
    return 0;
}

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

字符串转置,反转

跟int数组反转一样的
只不过就是char类型而已
很简单的


void swapchar(char a[], int i, int j)
{
    char tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}

void strReverse(char str[], int n)
{
    //这个长度需要自己串入
    for (size_t i = 0; i < n/2; i++)
    {
        swapchar(str, i, n - 1 - i);//每次调换n-1位置和0位置
    }
    //传入数组,即地址
}

void printArr4(char a[], int n)
{
    for (size_t i = 0; i < n; i++)
    {
        printf("%c ", a[i]);
    }
    printf("
");
}

void f89(void)
{
    char str[] = "hello hhh";
    int n = strlen(str);
    printArr4(str, n);
    strReverse(str, n);
    printArr4(str, n);

}

int main()
{//固定的形式

    f89();

    system("pause");
    return 0;
}

在这里插入图片描述
如果是用指针操作,就牛逼了


void strReverse2(char* str)
{
    char* i = str;//起始位置
    char* j = str + strlen(str) - 1;//末尾位置
    while (i < j)
    {
        //左右交换
        char tmp = *i;
        *i = *j;//交换
        *j = tmp;
        i++;
        j--;//下标挪动。
    }
}

void printArr4(char a[], int n)
{
    printf("%s", a);
    printf("
");
}

void f89(void)
{
    char str[] = "hello hhh";
    int n = strlen(str);
    printArr4(str, n);
    strReverse(str, n);
    printArr4(str, n);
    strReverse2(str, n);
    printArr4(str, n);

}

在这里插入图片描述
这更简单了
美滋滋

屌爆了

判断字符串是否回文

超级简单的
之前我都写过

今天再来写一波

用指针的方式搞定
abcba
前后倒着读一样
跟逆序一样的

简单得很


int strBack(char* str)
{
    char* i = str;//起始位置
    char* j = str + strlen(str) - 1;//末尾位置
    while (i < j)
    {
        //左右交换
        if (*i != *j) return 0;//有一个gg不行
        i++;
        j--;//下标挪动。
    }
    return 1;
}

void printArr4(char a[], int n)
{
    printf("%s", a);
    printf("
");
}



void f90(void)
{
    char str[] = "abcba";
    int n = strlen(str);
    printArr4(str, n);
    int ans = strBack(str);
    printf("%d
", ans);
}

int main()
{//固定的形式

    f90();

    system("pause");
    return 0;
}

在这里插入图片描述
在这里插入图片描述

字符串处理函数string.h

咱们前面写过很多的函数,这波我们可以封装起来,将来直接调用即可
不要自己写了

strcpy(dest, src)字符串拷贝函数

在这里插入图片描述


void f91(void)
{
    char dest[100] = { 0 };
    char src[] = "helloworld";//这是没法拷贝的,太大

    //保证dest要足够大哦
    char* p = strcpy(dest, src);
    printf("%s
", p);
}


int main()
{//固定的形式

    f91();

    system("pause");
    return 0;
}

在这里插入图片描述
接受是char*哦
也可以不接受

void f91(void)
{
    char dest[100] = { 0 };
    char src[] = "helloworld";//这是没法拷贝的,太大

    //保证dest要足够大哦
    char* p = strcpy(dest, src);
    printf("%s
", p);
    printf("%s
", dest);
}

在这里插入图片描述
反正拷贝到dest中了
如果在这里插入图片描述
如果dest不够大,它还是不会报错的
但是后面的东西gg
不安全,超过长度的无法保障的

如何安全呢?
strncpy


void f91(void)
{
    char dest[100] = { 0 };
    char destn[5] = { 0 };//n代表5
    char src[] = "helloworld";//这是没法拷贝的,太大

    //保证dest要足够大哦
    char* p = strcpy(dest, src);
    int n = 5;//ncpy
    char* p2 = strncpy(destn, src, n);

    printf("%s
", p);
    printf("%s
", dest);

    printf("%s
", p2);
    printf("%s
", destn);



}

在这里插入图片描述
后面的不管
在这里插入图片描述

字符串拼接函数:strcat,strncat

在这里插入图片描述

void f92(void)
{
    char dest[100] = "oooo";
    char destn[100] = "oooo";
    char src[] = "helloworld";//这是没法拷贝的,太大

    //保证dest要足够大哦
    char* p = strcat(dest, src);
    int n = 5;//ncpy
    char* p2 = strncat(destn, src, n);

    printf("%s
", p);
    printf("%s
", dest);

    printf("%s
", p2);
    printf("%s
", destn);

}

在这里插入图片描述
形成了一个新的字符串
在这里插入图片描述
要保证dest足够大

字符串比较函数strcmp(str1,str2)

相等返回0
大于返回1
小于返回-1


void f93(void)
{
    char dest[100] = "oooo";
    char destn[100] = "oooo";

    int n = strcmp(dest, destn);
    printf("%d
", n);
}

在这里插入图片描述
很简单
上一节,我们写过这个手撕代码的


void f93(void)
{
    char dest[100] = "oooo";
    char destn[100] = "oooo";

    int n = strcmp(dest, destn);
    int k = strcmp(dest, destn, 3);
    printf("%d
", n);
    printf("%d
", k);
}

在这里插入图片描述
ncmp的话就是比钱n个即可
在这里插入图片描述

sprintf函数,字符串打印到buf缓冲区

在这里插入图片描述
指定字符串的格式
遇到结束
写到buf中


void f94(void)
{
    printf("%d%c%d=%d
", 1,'+', 1,2);
    char buf[100] = { 0 };//缓冲区
    sprintf(buf, "%d%c%d=%d", 1,'+', 1,2);//写入缓存区,再去打印
    puts(buf);//打印也行
}

在这里插入图片描述

sscanf函数,就是在指定buf缓冲区中读取字符串


void f94(void)
{
    printf("%d%c%d=%d
", 1,'+', 1,2);
    char buf[100] = { 0 };//缓冲区
    sprintf(buf, "%d%c%d=%d", 1,'+', 1,2);//写入缓存区,再去打印
    puts(buf);//打印也行

    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    printf("%d+%d=%d
", a, b, a+b);

    char* buf2 = "1+2=3";
    sscanf(buf2, "%d+%d=%d");
}

在这里插入图片描述
反正buf2就是参数
直接从这里获取
或许将来fscanf就直接从文件中读取了

这是写c++算法代码的很重要一步,我之前gg了
在这里插入图片描述

字符中查找字符或子串

strchar()


void f95(void)
{
    char* p = strchr("abc", 'b');//中b,返回字符串
    char* p1 = strrchr("abc", 'b');//从右向左找,但是还是找b
    char* p2 = strstr("abcc", "bc");//子串
    puts(p);
    puts(p1);
    puts(p2);
}

在这里插入图片描述
easy
子串不能写字符哦


总结

提示:重要经验:

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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。