5.字符串与字符数组

一、基本介绍

1.定义

一个字符串 S S S 是将 n n n 个字符顺次排列形成的序列, n n n 称为 S S S 的长度,表示为 ∣ S ∣ |S| S

如果字符串下标从 1 1 1 开始计算, S S S 的第 i i i 个字符表示为 S [ i ] S[i] S[i]

如果字符串下标从 0 0 0 开始计算, S S S 的第 i i i 个字符表示为 S [ i − 1 ] S[i-1] S[i1]

2.基本运用

声明、赋值和输出的方式与基础数据类型相同

string str;
str = "China";
cout << str << endl;

3.加法运算

string s1 = "Chi", s2 = "na";
string str = s1 + s2;
cout << str << endl;

字符串加法表示字符串的连接

4.字典序

设存在两个字符串 s 1 , s 2 s1,s2 s1,s2,长度分别为 n , m ( n ≤ m ) n,m(n\leq m) n,m(nm)。字符串比较时以 A S C I I ASCII ASCII码值大小为依据,逐位进行比较排序。若前 n n n位相同,则长度更长的字符串更大。

字符串比较时可以直接使用比较运算符来进行操作。

string s1 = "the", s2 = "these";
cout << (s1 < s2) << endl;//true

5.子串与子序列

  • 子串:字符串 S S S子串 S [ i . . . j ] , i ≤ j S[i...j],i\leq j S[i...j],ij,表示 S S S 串中从 i i i j j j 这一段,也就是顺次排序 s [ i ] , s [ i + 1 ] , . . . , s [ j ] s[i],s[i+1],...,s[j] s[i],s[i+1],...,s[j] 形成的字符串
  • 子序列:字符串 S S S子序列是从 S S S 中将若干元素提取出来并不改变相对位置形成的序列,即 s [ p 1 ] , s [ p 2 ] , . . . , s [ p k ] , 0 ≤ p 1 ≤ p 2 ≤ p k ≤ ∣ S ∣ − 1 s[p_1],s[p_2],...,s[p_k],0\leq p_1\leq p_2\leq p_k\leq|S|-1 s[p1],s[p2],...,s[pk],0p1p2pkS1

6.前缀与后缀

后缀 是指从某个位置 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 开始到整个串末尾结束的一个特殊子串。字符串 S S S 的从 i i i 开头的后缀表示为 Suffix(S,i) \textit{Suffix(S,i)} Suffix(S,i),也就是 Suffix(S,i) = S [ i . . ∣ S ∣ − 1 ] \textit{Suffix(S,i)}=S[i..|S|-1] Suffix(S,i)=S[i..∣S1]。举例来说,字符串 abcabcd 的所有后缀为 {d, cd, bcd, abcd, cabcd, bcabcd, abcabcd}

前缀 是指从串首开始到某个位置 i i i 结束的一个特殊子串。字符串 S S S 的以 i i i 结尾的前缀表示为 Prefix(S,i) \textit{Prefix(S,i)} Prefix(S,i),也就是 Prefix(S,i) = S [ 0.. i ] \textit{Prefix(S,i)}=S[0..i] Prefix(S,i)=S[0..i]。举例来说,字符串 abcabcd 的所有前缀为 {a, ab, abc, abca, abcab, abcabc, abcabcd}

二、读入

1.读取一个字符串

string str;
cin >> str;

2.读取一整行

因为cin会自动以空格为字符串的分隔,所以获取包含空格的字符串,我们需要使用getline来获取一整行的所有字符作为一个新的字符串,然后根据题目的情况去做拆分。

string str;
getline(cin,str);

三、基本函数运用

1.获取字符串长度

string str = "China";
cout << str.size() << endl;//5
cout << str.length() << endl;//5

2.查找子串位置

传递一个参数,表示需要查找的字符串,返回一个整数,表示所查找的字符串所在的下标。

string str = "China";
cout << str.find("in") << endl;//2

3.插入字符串

第一个参数表示起始位置,第二个参数表示需要插入的字符串

string str = "China";
str.insert(2,"someone");
cout << str << endl;//Chisomeonena

4.截取字符串

第一个参数表示起始位置,第二个参数表示截取长度

string str = "Chinese people";
cout << str.substr(2) << endl;//inese people
cout << str.substr(2,4) << endl;//ines

5.替换字符串

第一个参数表示起始位置,第二个参数表示替换长度(原字符串),第三个参数表示新的字符串

string str = "Chinese people";
cout << str.replace(0,7,"American") << endl;//American people

6.翻转字符串

reverse(arr+i,arr+j)反转数组 i ∼ j − 1 i\sim j-1 ij1上的所有元素(不只是字符串)

reverse(a.begin()+i,a.begin()+j)反转string类型的字符串上 i ∼ j − 1 i\sim j-1 ij1上的所有元素

使用reverse函数需要添加头文件#include <algorithm>

#include <iostream>
#include <algorithm>

using namespace std;
int main()
{
    string str = "China";
    reverse(str.begin(), str.end());
    cout << str << endl;//anihC
    
    return 0;
}

四、C语言中的字符数组

在 C 语言中我们使用字符数组来表示字符串,即类型为 char 的数组。定义方式与普通的数组完全一致,并会使用空字符 \0 表示字符串的结尾。

1.输入输出

因为数组的名字本身就代表地址,所以在读入字符串时不需要加上 &。注意 scanf 会在遇到空格和回车时终止读入。

char str[110];
scanf("%s",str);
printf("%s",str);

2.获取字符串的长度

strlen(const char *str):返回从 str[0] 开始直到 '\0' 的字符数。注意,未开启 O2 优化时,该操作写在循环条件中复杂度是 O ( N ) O(N) O(N) 的。

3.比较两个字符串

strcmp(const char *str1, const char *str2):按照字典序比较 str1 str2str1 字典序小返回负值,两者一样返回 0str1 字典序更大则返回正值。请注意,不要简单的认为返回值只有 01-1 三种,在不同平台下的返回值都遵循正负,但并非都是 01-1

4.复制字符串

strcpy(char *str, const char *src):把 src 中的字符复制到 str 中,str src 均为字符数组头指针,返回值为 str 包含空终止符号 '\0'

五、作业

P1055 [NOIP2008 普及组] ISBN 号码

P1781 宇宙总统

P1957 口算练习题

P5015 [NOIP2018 普及组] 标题统计

P5734 【深基6.例6】文字处理软件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值