常用字符串处理函数入门

字符串处理函数 strxxx

用于处理使用char定义的字符串

头文件:#include <cstring>
ps.在C语言中,字符串相关函数的头文件为<string.h>,在C++中,一般去掉.h,在其前面加c

pps.文末有一道例题,可以先去看看例题怎么做,再回来看这几种函数

备用知识——字符串截止符 \0

当以输入等形式为字符串赋值后,会自动在字符串的末尾加入\0,占用一个字符位置,表示字符串到此结束。
例如:

char s[100]="xintongnb!"

则实际存储时,存储的内容为:

'x','i','n','t','o','n','g','n','i','u','b','i','\0'

就算人为在\0后添加其他字符,使用函数处理字符串时,\0后的字符将被无视。例如:

char s[100]="1234567\0abcdefg";
cout<<s;

输出:

1234567

strlen

用于获取字符串长度,处理到’\0’为止,并且在计算长度时不包含’\0’
eg1.

char s[100]="1234567";
cout<<strlen(s);

输出:

7

eg2.

char s[100]="1234567\0abcd";
cout<<strlen(s);

输出:

7

实际存储内容为:‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,’\0’,‘a’,‘b’,‘c’,‘d’,但使用strlen函数获取字符串长度时,处理到’\0’就停止了

strlen的常见用法

作为for循环的终止条件

例:将输入的小写字母全部转换为大写:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s[100];
    cin>>s;
    for(int i=0;i<strlen(s);i++){
        s[i]-=('a'-'A');
    }
    cout<<s;
    return 0;
}

输入

abcdefg

输出

ABCDEFG

strcpy

strcpy(str1,str2);

将后面的字符串str2覆盖到前面的字符串str1上。相当于:

  1. str1的内容清空
  2. str2的内容粘贴到str1
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s1[10]="7758521",s2[10]="no";
    strcpy(s1,s2);
    cout<<s1;
    return 0;
}

输出:

no

strcpy的常见用法

交换两个字符串

其核心思想,非常像以前学过的“交换两个整数a,b”:

int t;//建立一个中间容器t
t=a;//把a赋值给t
a=b;//把b赋值给a
b=t;//把t赋值给b

t相当于“中转站”,起到暂时存储的作用。

现在将整数换成字符串,=不能直接用,用strcpy函数代替=的作用

char t[100];//建立中间容器t,注意t的长度要足以容下a和b
strcpy(t,a);//把a赋值给t
strcpy(a,b);//把b赋值给a
strcpy(b,t);//把t赋值给b

strcat

strcat(str1,str2);

将后面的字符串str2拷贝到前面的字符串上,相当于:

  1. 复制str2的内容
  2. 粘贴到str1的后面

需要注意,str1原来的’\0’自动删除,在新字符串的末尾生成新的’\0’

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char s1[10]="7758521",s2[10]="no";
    strcat(s1,s2);
    cout<<s1;
    return 0;
}

输出:

7758521no

原来的s1: ‘7’,‘7’,‘5’,‘8’,‘5’,‘2’,‘1’,’\0’;
原来的s2: ‘n’,‘o’,’\0’;
新的s1: ‘7’,‘7’,‘5’,‘8’,‘5’,‘2’,‘1’,‘n’,‘o’,’\0’;


strcmp

strcmp(str1,str2);

依照字典序比较两个字符串,若:

  1. 后面的字符串“大”(字典序靠后),则返回一个负值
  2. 前面的字符串“大”(字典序靠后),则返回一个正值
  3. 前后字符串一样,则返回0

实际的比较过程:从第一个字符开始比较,如果一样就比较下一个,直到找到不一样的字符,返回两个字符的ASCII码差值(前减后)

例如

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[100]="abcd",b[100]="abca",c[100]="abcx",d[100]="abcd";
    cout<<strcmp(a,c)<<endl;
    cout<<strcmp(a,b)<<endl;
    cout<<strcmp(a,d);
    return 0;
}

输出

-20
3
0

实际上就相当于:

cout<<(int)('d'-'x')<<endl;
cout<<(int)('d'-'a')<<endl;
cout<<(int)('d'-'d');

注意,当两个字符串的实际长度不一样时,比较过程还是如上过程,如果在字符串结束前找到不一样的字符,直接返回比较结果:

char lon[100]="abcde",shor[10]="abd";
cout<<strcmp(lon,shor);

输出:

-1

而若一直到较短字符串结束,都没找到不一样的字符,则将较长字符串的下一个字符与空字符比较,空字符的ASCII码为0:

char lon[100]="abcde",shor[10]="abc";
cout<<strcmp(lon,shor);

输出

100

相当于直接输出(int)'d'(d的ASCII码是100)

ps.ASCII码表

strcmp的常见用法

判断两个字符串是否相等(取代“==”的作用)

直接用strcmp是否为0判断两个字符串是否相等。

有时候在一堆字符串里,寻找目标字符串,也会用到这一功能

比如在一堆人名里找到LiHua,返回他的位置:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char name[10][100]={"Tom","Jerry","Spike","LiHua","Daming","Amy"};
    char kill[10]="LiHua";
    for(int i=0;i<6;i++)
        if(strcmp(name[i],kill)==0){
            cout<<i;
            break;
        }
    return 0;
}

ps.Spike是猫和老鼠里的狗
Spike

与sort搭配使用

用于给一堆字符串进行字典序排序
(不会不知道sort吧,不会吧不会吧)
不熟悉sort的同学可以参考我的另一篇博客:
sort函数入门用法

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
struct node{
    char name[100];
}p[10];
bool cmp(node x,node y){
    if(strcmp(x.name,y.name)<0)return 1;
    return 0;
}
int main()
{
    for(int i=0;i<6;i++)cin>>p[i].name;
    sort(p,p+6,cmp);
    for(int i=0;i<6;i++)cout<<p[i].name<<" ";
    return 0;
}

输入:

Tom Jerry Spike LiHua Daming Amy

输出:

Amy Daming Jerry LiHua Spike Tom 

strstr

strstr(str1,str2);

str1内查找str2的位置,并返回查找到的首地址;若没找到,返回NULL

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char word[100]="iwontgiveup";
    char t[10]="give";
    cout<<strstr(word,t)-word;
    return 0;
}

输出

5

在上面的例子中,strstr函数返回的是字符串word第五位的地址,要得到5这个数字,还需要减去字符串首位地址,也就是word。为了更好理解,也可以这样写:

cout<<strstr(word,t)-&word[0];

这样就可以明确的看出是减去首地址,输出一样的结果。


进阶用法

上述各个函数的括号内,都直接写字符串名,其实质是传入字符串的首地址,达到了操作整个字符串的效果

也就是说,我们可以传入字符串的中间地址,来实现操作部分字符串

ps.字符串与数组一样,都是从第0位开始,也就是说如果传入的地址是&a[2],我们说是“从第二位开始”,但实际上是肉眼可见的第三个字符。

strlen

char s[100]="1234567";
cout<<strlen(&s[2]);//从第二位开始计数

输出

5

参与计数的元素:‘3’,‘4’,‘5’,‘6’,‘7’

strcpy

char a[100]="Tom",b[100]="andJerry";
strcpy(a,&b[3]);//从b的第三位开始拷贝,然后覆盖到a上
cout<<a;

输出

Jerry

strcat

char a[100]="you",b[100]="do not love me";
strcat(a,&b[6]);
cout<<a;

输出

you love me

strcmp

char a[100]="888abcd",b[100]="abcb";
cout<<strcmp(&a[3],b);//从a的第三位开始比较

输出

2

strstr

char a[100]="888abcd",b[100]="tabc";
cout<<strstr(a,&b[1])-a;

输出

3

相当于:

char a[100]="888abcd",bb[100]="abc";
cout<<strstr(a,bb)-a;

例题传送站:洛谷P5734

题解传送站:题解P5734【文字处理软件】

猜你喜欢

转载自blog.csdn.net/pyx2466079565/article/details/107533632