本课主要介绍了以下内容。
字符数组是指元素为字符类型的数组。字符数组可以用来存放字符序列何字符串。
注意,字符序列就是一个或多个字符,二字符串除了字符,结尾还要有字符串结束标识。
char a[5] = {'a', 'b', 'c', 'd', 'e'};
字符数组中也可以存放字符串。字符数组和字符串的区别就在于是否存在字符串结束标识——‘\0’。
char a[5] = {'a', 'b', 'c', 'd', '\0'};
char a[5] = "abcde";
//char a[] = "abcde";
char b[3][4] = {"abc", "mno", "xyz"};
//char b[][4] = {"abc", "mno", "xyz"};
在数组b中存放着3各字符串,每一个字符串的长度不得大于3。
char c[3];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';
字符串是用双引号括起来的一串字符,这串字符可以是英文、中文和各种标点符号。为了更加灵活方便第处理字符串,C++的STL中提供了字符串数据类型——string。
代码如下(示例):
string str = "hello, world!"; //定义字符串str
string s1(str); //定义字符串s1, 并把str的内容赋给s1
string s2(str, 2); //定义字符串s2, 并把str从下标标2开始的内容赋给s2
string s3(str, 2, 3); //定义字符串s3, 并把str从下标标2开始的3个字符赋给s3
string s4(4, 'H'); //定义字符串s4, 并把4个'H'赋给s4
可以象使用普通变量一样,用cin和cout输入输出字符串,但字符串中不能包含空格字符。如果象输入包含空格的字符串可以使用getline()函数,该函数用于读入一行字符,格式如下:
getine(cin, str);
代码如下(示例):
#include<iostream>
using namespace std;
int main() {
string str1, str2;
cin >> str1;
getline(cin, str2);
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
运行程序,输入输出如下。
How are you?
How
are you?
如果先使用getline()语句,在使用cin语句,则输入输出则会不同。
#include<iostream>
using namespace std;
int main() {
string str1, str2;
getline(cin, str2);
cin >> str1;
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
运行程序,输入输出如下。
How are you?
How are You?
How
How are you?
字符出操作函数是字符串编程有力的工具。常用的操作主要有字符串的判空、增、删、改、查、读等6类。
语法格式
字符串变量.empty();
empty()方法判断字符串是否为空,为空返回真,不空返回假。
(1)字符串尾部插入
使用字符串连接运算符’+'。
使用字符串追加方法append()。其格式如下
字符串变量1.append(字符串常量或字符串变量[, 起始下标, 截取长度])
例如
str1.append(str2);
str1.append(str2, 1, 3); //截取字符串变量追加到str1尾部
str1.append("Break");
str1.append("Break", 1, 2); //截取字符串常量追加到str1尾部
(2)字符串头部或中间插入
字符串头部或中间插入我们可以使用insert()方法来完成,其语法格式如下。
字符串变量1.insert(插入下标位置, 字符串常量或字符串变量[, 起始下标, 截取长度])
此为在字符串变量1指定下标位置插入字符串,方括号部分可以省略。
例如
str1.insert(3, str2);
str1.insert(3, str2, 1, 3); //截取字符串变量追加到str1尾部
str1.insert(3, "Break");
str1.insert(3, "Break", 1, 2); //截取字符串常量追加到str1尾部
(1)删除字符串全部字符
删除字符串全部字符元素使用其clear()方法。语法格式如下。
字符串变量.clear();
(2)删除字符串中某部分字符
删除字符串一部分字符元素使用其erase()方法。语法格式如下。
字符串变量.erase(待删除位置下标[, 删除字符个数]);
例如
#include<iostream>
using namespace std;
int main() {
string str1 = "Hello, World!";
string str2 = "Hello, C++!";
str1.erase(3); //删除字符串变量str1从下标3开始的字符
str2.erase(3, 2); //删除字符串变量str2从下标3开始的2个字符
cout << str1 << endl;
cout << str2 << endl;
return 0;
}
运行程序,输出如下。
Hel
Hel, C++!
(1)字符串整体赋值操作
例如
str1 = "Hello, C++!";
str2 = str1;
(2)给字符串中的单个字符赋值
可以使用如下两种形式:
str1[i] = 'C';
str2.at(i) = 'C'
(3)两个字符串交换操作
C++提供了swap()函数来完成两个字符串的交换操作。其语法格式如下。
swap(str1, str2)
(4)字符串替换操作
我们可以使用replace()方法来完成字符串内容的替换操作,其语法格式如下。
字符串变量1.replace(替换起始位置, 替换元素个数, 字符串常量或字符串变量[, 起始下标, 截取长度])
例如
str1.replace(1, 3, str2);
str1.replace(1, 3, str2, 1, 3); //将str1中下标1开始的连续3个字符替换成截取字符
str1.replace(1, 3, "Break");
str1.replace(1, 3, "Break", 1, 2); //将str1中下标1开始的连续3个字符替换成截取字符
字符串对象提供了find()方法来进行子串的查找操作。语法格式如下。
字符串变量1.find(子串)
若找到,方法返回子串在字符串变量1中第一次出现的位置;若未找到,则返回-1。
获取字符串的长度,可以使用字符串对象的length()方法,也可以使用字符串对象的size()方法。
例如
str1.length();
str1.size();
截取子串可以使用字符串对象的substr()方法,其格式如下。
字符串变量1.substr(起始下标[, 字符个数])
例如
str1.substr(2); //截取str1中从下标2开始到结尾的字符作为返回值
str1.substr(2, 3); //截取str1中从下标2开始3个字符作为返回值
字符串比较大小,可以直接使用==、 !=、 <、 <=、 >、 >=运算符。
例如
str1 > str2;
str1 == str3;
一个字符串正着读和反着读都一样。则可以认为该字符串是一个回文字符串 。
给你一个字符串 s,如果它是 回文串 ,返回"Yes";否则,返回 “No” 。
#include<iostream>
using namespace std;
int main() {
string str = "amanaplanacanalpanama";
int l, r, len = str.length();
l = 0;
r = len-1;
while(r>=l && str[l]==str[r]) {
l++;
r--;
}
if(r<=l) {
cout << "Yes" << endl; // is a palindromic string
} else {
cout << "No" << endl; // is not a palindromic string
}
return 0;
}
如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样,则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。
示例 1: 输入: s = “A man, a plan, a canal: Panama”; 输出:true。解释:“amanaplanacanalpanama” 是回文串。
示例 2: 输入:s = “race a car”; 输出:false。 解释:“raceacar” 不是回文串。
示例 3: 输入:s = " "; 输出:true。解释:在移除非字母数字字符之后,s 是一个空字符串 “” 。由于空字符串正着反着读都一样,所以是回文串。
#include<iostream>
using namespace std;
int main() {
//string str = "amanaplanacanalpanama";
string str = "A man, a plan, a canal: Panama";
int l, r, len = str.length();
//将字符串中大写字母则转换为小写
for(int i=0; i<len; i++) {
if(str[i]>='A' && str[i]<='Z') {
str[i] += 32; // +32 to lower
//str[i] = str[i]-'A'+'a';
}
}
cout << str << endl;
//对字符串进行遍历,根据ASCII码,筛选出数字和字母,筛选掉其他类型
char str2[len];
int index = 0;
for(int i=0; i<len; i++) {
//if((str[i]>=97 && str[i]<=122) || (str[i]>=48 && str[i]<=57)) {
if((str[i]>='a' && str[i]<='z') || (str[i]>='0' && str[i]<='9')) {
str2[index++] = str[i];
}
}
str2[index] = '\0';
cout << "str2: " << str2 << endl;
//对字符串str2进行回文判断
l = 0;
r = index-1;
while(r>=l && str2[l]==str2[r]) {
l++;
r--;
}
if(r<=l) {
cout << "Yes" << endl; // is a palindromic string
} else {
cout << "No" << endl; // is not a palindromic string
}
return 0;
}
运行程序,输出如下。
a man, a plan, a canal: panama
str2: amanaplanacanalpanama
Yes