字符串
关于C++语法类的最后一篇笔记了吧!(上一篇关于语法的笔记好像也是这么说的hh) 本来不打算写字符串的,但想到去年校赛挂在了字符串的题目上,于是还是决定写一下吧,算是给自己重新梳理一下关于字符串的知识点hhh(写语法也太耗时间了叭!下次绝对不写语法了)
1.字符与整数的联系——ASCII码
每个常用字符都对应一个-128~127的数字,二者之间可以相互转化
#include<iostream>
using namespace std;
int main()
{
char c='a';
cout<<(int)c<<endl;
cout<<(char)97<<endl;
return 0;
}
结果证明如下
输出ASCII码
#include<iostream>
using namespace std;
int main()
{
for(int i=1;i<128;i++)
{
printf("%d: %c\n",i,(char)i);
}
return 0;
}
结果证明如下
常用ASCII值:‘A’~'Z’是65 ~ 90,‘a’~'z’是97 ~ 122,‘0’~'9’是48 ~ 57
字符可以参与运算,运算时会将其当做整数
#include<iostream>
using namespace std;
int main()
{
printf("%d\n",'b'-'a');
return 0;
}
结果证明如下
再举个例子
#include<iostream>
using namespace std;
int main()
{
printf("%c\n",'a'+3);
return 0;
}
结果证明如下
再举一个例子
#include<iostream>
using namespace std;
int main()
{
char c='a';
cout << (int)c << endl;
int a=66;
cout << (char)a << endl;
return 0;
}
结果证明如下
再再举个例子
#include<iostream>
using namespace std;
int main()
{
int a='B'-'A';
int b='A'*'B';
char c='A'+2;
cout<<a<<endl;
cout<<b<<endl;
cout<<c<<endl;
return 0;
}
证明结果如下
例题:输入一行字符,统计出其中数字字符的个数,以及字母字符的个数
#include<iostream>
using namespace std;
int main()
{
char c;
int nums=0,chars=0;
while(cin>>c)
{
if(c>=48&&c<=57)
{
nums++;
}
else if(c>='A'&&c<='Z'||c>='a'&&c<='z')
{
chars ++;
}
}
printf("nums: %d\nchars:%d\n",nums,chars);
return 0;
}
结果证明如下
2.字符数组
字符串就是字符数组加上结束符’\0’
字符数组就是用来存储字符串的数组
可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1
ps:字符用单引号’ ',字符串用双引号" "
#include<iostream>
using namespace std;
int main()
{
char a1[]={'C','+','+'};
char a2[]={'C','+','+','\0'};
char a3[]="C++";
char a4[6]="Daniel";
return 0;
}
字符数组的输入输出
(1)输出
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char a1[]={'C','+','+'};
char a2[]={'C','+','+','\0'};
char a3[]="C++";
cout<<a3<<endl;
printf("%s\n",a3);
return 0;
}
结果证明如下
再举个例子
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char a2[]={'A','B','C','\0'};
char a3[]="ABCDEF";
cout<<a2<<endl;
cout<<a2+1<<endl;
printf("%s\n",a3+2);
return 0;
}
结果证明如下
(2)输入
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char s[100];
cin>>s+2;
scanf("%s",s+2);
cout<<s+2<<endl;
printf("%s\n",s+2);
return 0;
}
读入一行字符串,包括空格
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char s[100];
fgets(s,100,stdin);
cout<<s<<endl;
return 0;
}
结果证明如下
字符数组的常用操作
下面几个函数需要引入头文件:
#include <cstring>
(1) strlen(str),求字符串的长度(不包含最后的\0字符)
(2) strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!
(3) strcpy(a, b),将字符串b复制给从a开始的字符数组。
例题:给定一个只包含小写字母的字符串,请你找到第一个仅出现一次的字符。如果没有输出"no"
#include<cstring>
#include<iostream>
using namespace std;
char str[100010];
int cnt[26];
int main()
{
int len=strlen(str);
cin>>str;
for(int i=0;str[i];i++)
{
cnt[str[i]-'a']++;
}
for(int i=0;str[i];i++)
{
if(cnt[str[i]-'a']==1)
{
cout<<str[i]<<endl;
return 0;
}
}
puts("no");
return 0;
}
遍历字符数组中的字符
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char a[100]="hello world";
for(int i=0;i<strlen(a);i++)
{
cout<<a[i]<<endl;
}
return 0;
}
结果证明如下
3.标准库类型 string
可变长的字符序列,比字符数组更加好用。需要引入头文件
#include <string>
(1)定义和初始化
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s1;
string s2=s1;
string s3="hiya";
string s4(10,'c');
return 0;
}
(2)string上的操作
1.string的读写
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
cout<<s1<<s2<<endl;
return 0;
}
注:不能用printf直接输出string,需要写成:printf("%s",s.c_str());
2.使用getline读取一整行
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s;
getline(cin,s);
cout<<s<<endl;
return 0;
}
3.string的empty和size操作(注意size是无符号整数,因此s.size()<=-1一定成立)
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s1,s2="abc";
cout<<s1.empty()<<endl;
cout<<s2.empty()<<endl;
cout<<s2.size()<<endl;
return 0;
}
4.string 的比较:
支持 > < >= <= == !=等所有比较操作,按字典序进行比较。
5.为string对象赋值:
string s1(10, 'c'), s2;
s1 = s2;
6.两个string对象相加:
string s1 = “hello, ”, s2 = “world\n”;
string s3 = s1 + s2;
s1 += s2;
7.字面值和string对象相加:
做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:
string s1 = “hello”, s2 = “world”;
string s3 = s1 + “, “ + s2 + ‘\n’;
当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:
string s4 = s1 + “, “;
string s5 = “hello” +”, “;
string s6 = s1 + “, “ + “world”;
string s7 = “hello” + “, “ + s2;
(3)处理string对象中的字符
可以将string对象当成字符数组来处理:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s="hello world";
for(int i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
}
return 0;
}
或者使用基于范围的for语句:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s="hello world";
for(char c:s)
{
cout<<c<<endl;
}
for(char &c:s)
{
c='a';
}
cout<<s<<endl;
return 0;
}
处理string对象中的字符
可以将string对象当成字符数组来处理:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s="hello world";
for(int i=0;i<s.size();i++)
{
cout<<s[i]<<endl;
}
return 0;
}
或者使用基于范围的for语句:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s="hello world";
for(char c:s)
{
cout<<c<<endl;
}
for(char &c:s)
{
c='a';
}
cout<<s<<endl;
return 0;
}
|