• 3.字符串


    一、基本介绍

    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;
    
    • 1
    • 2
    • 3

    3.加法运算

    string s1 = "Chi", s2 = "na";
    string str = s1 + s2;
    cout << str << endl;
    
    • 1
    • 2
    • 3

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

    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
    
    • 1
    • 2

    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;
    
    • 1
    • 2

    2.读取一整行

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

    string str;
    getline(cin,str);
    
    • 1
    • 2

    三、基本函数运用

    1.获取字符串长度

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

    2.查找子串位置

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

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

    3.插入字符串

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

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

    4.截取字符串

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

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

    5.替换字符串

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

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

    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

    #include 
    #include 
    
    using namespace std;
    int main()
    {
        string str = "China";
        reverse(str.begin(), str.end());
        cout << str << endl;//anihC
        
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    四、C语言中的字符数组

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

    1.输入输出

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

    char str[110];
    scanf("%s",str);
    printf("%s",str);
    
    • 1
    • 2
    • 3

    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】文字处理软件

  • 相关阅读:
    物联网技术融合成为新趋势,LPWAN2.0泛在物联·ZETA生态大会在深圳召开
    C#连接TaoS数据库错误:dotnet版本不匹配的问题
    我的创作纪念日的温柔与七夕的浪漫交织了在一起
    【轮询负载均衡规则算法设计题】
    Spring启动源码分析以及生命周期
    如何快速搜索多个文件中内容是否有你需要的东西?
    组合总和 II
    【EI会议】第三届大数据、人工智能与风险管理国际学术会议 (ICBAR 2023)
    [平台运维、Hadoop]kafka streams概述
    浏览器打印边距,默认/无边距,占满1页A4
  • 原文地址:https://blog.csdn.net/qq_40760407/article/details/128053220