字符串
- ’A’-‘Z’ 是65~90,’a’-‘z’是97-122,’0’-‘9’是48-57。(在大小写字母转换时会用到)
字符数组
- 字符串就是字符数组加上结束符’\0’。
- 可以使用字符串来初始化字符数组,但此时要注意,每个字符串结尾会暗含一个’\0’字符,因此字符数组的长度至少要比字符串的长度多1。
- 初始化:”Tom”需要定义char a[4],因为末尾要存放’\0’。
字符数组相关操作
- 初始化:
- 输入输出:输入字符串时,遇到空格或者回车就会停止。故引出了读入一行字符串包括空格的操作,详见下文。输出则没有影响,遇到空格或者回车不会停止。
- 普通输入和输出:
scanf("%s",s);
或者cin >> s;
。tips: 如果不想从0开始输入或输出可以加上数字,如:scanf("%s",s + 1);
- 读入一行字符串,包含空格:fgets(数组名,读取长度,stdin);
- 字符数组的常用操作:
下面几个函数需要引入头文件:
#include <string.h>
(1)strlen(str),求字符串的长度
(2)strcmp(a, b),比较两个字符串的大小,a < b 返回-1,a == b 返回0,a > b返回1。这里的比较方式是字典序!
(3)strcpy(a,b),将字符串b复制给从a开始的字符数组。
String
- 需要引入头文件:
#include <string>
string的操作
- 初始化:
- 输入输出:比较推荐cin和cout
注意:不能用printf直接输出string,需要写成:printf(“%s”, s.c_str());
使用getline(cin,s);读取一整行。 - 其他相关操作:
(1)string的xx.empty()和xx.size()操作(注意size是无符号整数,因此 s.size() <= -1一定成立)。
(2)string 的比较:支持 > < >= <= == !=等所有比较操作,按字典序进行比较。
(3)为string对象赋值:
string s1(10, ‘c’), s2;
// s1的内容是 cccccccccc;s2是一个空字符串
s1 = s2;
//赋值:用s2的副本替换s1的副本,此时s1和s2都是空字符串
(4)两个string对象相加:
string s1 = “hello, ”, s2 = “world\n”;
string s3 = s1 + s2;
// s3的内容是 hello, world\n
s1 += s2;
// s1 = s1 + s2
(5)字面值和string对象相加:
做加法运算时,字面值和字符都会被转化成string对象,因此直接相加就是将这些字面值串联起来:
string s1 = “hello”, s2 = “world”;
//在s1和s2中都没有标点符号
string s3 = s1 + "," + s2 + ‘\n’;
当把string对象和字符字面值及字符串字面值混在一条语句中使用时,必须确保每个加法运算符的两侧的运算对象至少有一个是string:
string s4 = s1 + ",";
//正确:把一个string对象和有一个字面值相加
string s5 = “hello” +",";
//错误:两个运算对象都不是string
string s6 = s1 + “, “ + “world”;
//正确,每个加法运算都有一个运算符是string
string s7 = “hello” + “, “ + s2;
//错误:不能把字面值直接相加,运算是从左到右进行的
(6)处理string对象中的字符
可以将string对象当成字符数组来处理。
或者使用基于范围的for语句。
for(char c : s) cout << c << endl;
其他做题遇到的知识点补充:
- substring();
包含头文件#include<cstring>
使用方法:s.substr(1,4);
功能:从s的第一个位置开始读取4个字符,注意是位置不是字符数组下标。 - stringstream();(770)
包含头文件#include<sstream>
使用方法:stringstream 变量名(s);//s为读入的字符串
将sin当作cin使用即可,例如while(变量名 >> str){}
功能:把一个字符串转换为一个字符串流。我们可以从中提取出任意想要格式的信息。和cin一样以空格分割。
与之相对的是sscanf(s,"%d%f%s",&a,&b,&str);
(用的少,stringstream读取未知个数的字符串方便)。 - 第一类双指针算法(771)
(1)从头遍历整个字符串,一重循环。
(2)定义一个新变量j,当j[i] == s[i]且j不越界的情况下,j就一直往后走,二重循环。
(3)i = j-1。
for(i = 0;i < s.size();i++){ int j = i; while(j < s.size()&&s[j] == s[i]){ j++; } i = j-1; }
- str.back()和str.pop_back()
back():返回当前字符串的最后一个字符。
pop_back():去除当前字符串的最后一个字符。