第16课 字符数组与字符串


前言

本课主要介绍了以下内容。

  1. 字符数组的定义、初始化和赋值
  2. 字符串类型变量的定义
  3. 字符串类型变量的输入和输出
  4. 字符串类型变量的操作函数

一、字符数组

字符数组是指元素为字符类型的数组。字符数组可以用来存放字符序列何字符串。
注意,字符序列就是一个或多个字符,二字符串除了字符,结尾还要有字符串结束标识。

1. 字符数组的定义

2. 字符数组的赋值

1. 用字符初始化数组

char a[5] = {'a', 'b', 'c', 'd', 'e'};

字符数组中也可以存放字符串。字符数组和字符串的区别就在于是否存在字符串结束标识——‘\0’。

char a[5] = {'a', 'b', 'c', 'd', '\0'};

2. 用字符串初始化数组

char a[5] = "abcde";
//char a[] = "abcde";
char b[3][4] = {"abc", "mno", "xyz"};
//char b[][4] = {"abc", "mno", "xyz"};

在数组b中存放着3各字符串,每一个字符串的长度不得大于3。

3. 数组元素赋值

char c[3];
c[0] = 'a';
c[1] = 'b';
c[2] = 'c';

4. 字符常量和字符串常量的区别

  1. 一个是单引号,一个是双引号
  2. 字符常量只能是单个字符或者转移字符,字符串常量可以是多个字符。

二、字符串类型

字符串是用双引号括起来的一串字符,这串字符可以是英文、中文和各种标点符号。为了更加灵活方便第处理字符串,C++的STL中提供了字符串数据类型——string。

1. 字符串变量的定义和初始化

代码如下(示例):

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

2. 字符串的输入和输出

可以象使用普通变量一样,用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?

3. 字符串的操作函数

字符出操作函数是字符串编程有力的工具。常用的操作主要有字符串的判空、增、删、改、查、读等6类。

1.字符串判空操作

语法格式

字符串变量.empty();

empty()方法判断字符串是否为空,为空返回真,不空返回假。

2.字符串增加操作

(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尾部

3.字符串删除操作

(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++!

4.字符串修改操作

(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个字符替换成截取字符

5.字符串查找子串操作

字符串对象提供了find()方法来进行子串的查找操作。语法格式如下。

字符串变量1.find(子串)

若找到,方法返回子串在字符串变量1中第一次出现的位置;若未找到,则返回-1。

6.字符串长度获取操作

获取字符串的长度,可以使用字符串对象的length()方法,也可以使用字符串对象的size()方法。
例如

str1.length();
str1.size();

7. 字符串截取子串操作

截取子串可以使用字符串对象的substr()方法,其格式如下。

字符串变量1.substr(起始下标[, 字符个数])

例如

str1.substr(2);		//截取str1中从下标2开始到结尾的字符作为返回值
str1.substr(2, 3);	//截取str1中从下标2开始3个字符作为返回值

8. 字符串比较大小操作

字符串比较大小,可以直接使用==、 !=、 <、 <=、 >、 >=运算符。
例如

str1 > str2;		
str1 == str3;	

三、练习

1. 判断回文字符串

一个字符串正着读和反着读都一样。则可以认为该字符串是一个回文字符串 。
给你一个字符串 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;
}

2. 判断回文字符串(二)

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样,则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。
示例 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
  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值