用于处理使用char定义的字符串
头文件:#include
ps.在C语言中,字符串相关函数的头文件为
,在C++中,一般去掉.h
,在其前面加c
pps.文末有一道例题,可以先去看看例题怎么做,再回来看这几种函数
当以输入等形式为字符串赋值后,会自动在字符串的末尾加入\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
用于获取字符串长度,处理到’\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’就停止了
例:将输入的小写字母全部转换为大写:
#include
#include
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(str1,str2);
将后面的字符串str2
覆盖到前面的字符串str1
上。相当于:
str1
的内容清空str2
的内容粘贴到str1
上#include
#include
using namespace std;
int main()
{
char s1[10]="7758521",s2[10]="no";
strcpy(s1,s2);
cout<<s1;
return 0;
}
输出:
no
其核心思想,非常像以前学过的“交换两个整数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(str1,str2);
将后面的字符串str2
拷贝到前面的字符串上,相当于:
str2
的内容str1
的后面需要注意,str1
原来的’\0’自动删除,在新字符串的末尾生成新的’\0’
#include
#include
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(str1,str2);
依照字典序比较两个字符串,若:
实际的比较过程:从第一个字符开始比较,如果一样就比较下一个,直到找到不一样的字符,返回两个字符的ASCII码差值(前减后)
例如
#include
#include
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是否为0判断两个字符串是否相等。
有时候在一堆字符串里,寻找目标字符串,也会用到这一功能
比如在一堆人名里找到LiHua,返回他的位置:
#include
#include
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;
}
用于给一堆字符串进行字典序排序
(不会不知道sort吧,不会吧不会吧)
不熟悉sort的同学可以参考我的另一篇博客:
sort函数入门用法
#include
#include
#include
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(str1,str2);
在str1
内查找str2
的位置,并返回查找到的首地址;若没找到,返回NULL
#include
#include
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]
,我们说是“从第二位开始”,但实际上是肉眼可见的第三个字符。
char s[100]="1234567";
cout<<strlen(&s[2]);//从第二位开始计数
输出
5
参与计数的元素:‘3’,‘4’,‘5’,‘6’,‘7’
char a[100]="Tom",b[100]="andJerry";
strcpy(a,&b[3]);//从b的第三位开始拷贝,然后覆盖到a上
cout<<a;
输出
Jerry
char a[100]="you",b[100]="do not love me";
strcat(a,&b[6]);
cout<<a;
输出
you love me
char a[100]="888abcd",b[100]="abcb";
cout<<strcmp(&a[3],b);//从a的第三位开始比较
输出
2
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【文字处理软件】