zoukankan      html  css  js  c++  java
  • C++字符串【string】和【char []】操作全攻略

    异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章发布平台为CSDN、博客园、简书和开源中国,后期可能会有个人博客,除此之外全部是盗文!


    一、char [] 类型

    1. 定义与输入

    1.1 定义时指定内容

    #include <iostream>
    using namespace std;
    int main() {
        char a[10] = "123";
        cout << a;
    
        return 0;
    }
    
    // 输出:123
    

    此时程序自动在 a[3] 的位置写入了终止符 ''

    #include <iostream>
    using namespace std;
    int main() {
        char a[10];
        a[0] = 'A';
        a[2] = 'C';
        cout << a;
    
        return 0;
    }
    
    // 输出:A
    

    char数组不赋值默认所有位置都是结束符 '' 。直接输出字符数组时,从起始地址开始,找到第一个结束符结束输出。

    1.2 朴素cin

    #include <iostream>
    using namespace std;
    int main() {
        char a[3];
        // 输入到第一个空格截止;需要保证将要获取的内容不多于a的长度否则溢出
        cin >> a;
        cout << a;
    
        return 0;
    }
    
    // 输入1:123
    // 输出1:123
    
    // 输入2:123 456
    // 输出2:123
    
    // 输入3:123456
    // 输出3:123456
    // 此时数组发生了溢出!
    

    严格来讲三个输入输出全部发生了数组溢出,因为前两个输入输出中 '' 也处于 a[3] 的位置

    1.3 cin.get()

    #include <iostream>
    using namespace std;
    int main() {
        char a[3];
        cin.get(a, sizeof(a));  // 第二个参数为a的长度
        cout << a;
    
        return 0;
    }
    
    // 输入:12345
    // 输出:12
    

    第6行 cin.get() 中的第二个参数限定了输入的最大长度:最大长度实际为传入的数字减一,因为a的最后一个位置需要存放 ''

    如果在未达到最大长度限制时出现空格,则输入从行开始读取到第一个空格结束。

    1.4 cin.getline()

    #include <iostream>
    using namespace std;
    int main() {
        char a[5];
        cin.getline(a, sizeof(a));  // 第二个参数为a的长度
        cout << a;
    
        return 0;
    }
    
    // 输入:1 2345
    // 输出:1 23
    

    与上方 cin.get() 的用法和意义完全相同,唯一区别是空格不会作为输入结束的条件

    1.5 gets()

    从此处开始程序需要包含头文件 stringstring.hcstring

    #include <cstring>
    #include <iostream>
    using namespace std;
    int main() {
        char a[5];
        gets(a);
        cout << a;
    
        return 0;
    }
    // 输入:1 2 3
    // 输出:1 2 3
    

    cin.getline() 唯一的不同就是不限制最大字符数,需要自行确认输入数据小于数组最大限制。越界有风险,偷懒需谨慎!

    1.6 对于1.3~1.5的警告内容

    注意: 对于先输入数字再输入字符串并使用 cin.get()cin.getline()gets() 方式时,程序会先读取当前行剩余部分(有可能只有一个回车符),而不会读取新的一行。若数字和字符串在同一行,则中间的空格也将作为字符串的一部分。

    具体请看样例

    程序 1

    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        char a[3];
        gets(a);
        cout << a;
        return 0;
    }
    

    输入 1-1

    10 abc
    def
    

    输出 1-1(开头有一个空格)

     abc
    

    输入 1-2

    10
    abcdef
    

    输出 1-2

    (空)
    

    解决方案如下

    程序 2

    #include <iostream>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        char a[3];
        gets(a);
        gets(a);
        cout << a;
        return 0;
    }
    

    输入 2-1

    10 abc
    def
    

    输出 2-1(开头有一个空格)

    def
    

    输入 2-1

    10
    abcdef
    

    输出 2-1

    abcdef
    

    2. 基本操作

    这部分所有代码都需要string相关头文件,使用1.2介绍的朴素cin方式输入

    2.1 获取长度

    #include <cstring>
    #include <iostream>
    using namespace std;
    int main() {
        char a[5];
        cin >> a;
        cout << strlen(a);
    
        return 0;
    }
    
    // 输入:123
    // 输出:3
    

    2.2 字符串复制

    #include <cstring>
    #include <iostream>
    using namespace std;
    int main() {
        char a[5], b[5];
        cin >> a;
        strcpy(b, a);
        cout << b;
    
        return 0;
    }
    
    // 输入:12345
    // 输出:12345
    

    2.3 字符串比较

    #include <cstring>
    #include <iostream>
    using namespace std;
    int main() {
        char a[5], b[5];
        cin >> a >> b;
        cout << bool(a > b);
    
        return 0;
    }
    
    // 输入:ef abcd
    // 输出:1
    

    比较的是字典序,字典序的解释如下:

    设想一本英语字典里的单词,何者在前何者在后? 显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

    2.4 字符串连接

    #include <cstring>
    #include <iostream>
    using namespace std;
    int main() {
        char a[20], b[6];
        cin >> a >> b;  // 别忘了朴素cin会以空格作为结束符
        strcat(a, b);
        cout << a;
    
        return 0;
    }
    
    // 输入:Hello World
    // 输出:HelloWorld
    

    对于 strcpy()strcat() 参数顺序如果不好记的话,就想着前面的是被改变的,后面的是不变的

    2.5 字符串搜索

    #include <cstring>
    #include <iostream>
    using namespace std;
    int main() {
        char a[20], b[6];
        cin >> a >> b;
        cout << strstr(a, b) - a;
    
        return 0;
    }
    
    // 输入:ababcab abc
    // 输出:2
    

    strstr(a, b) 返回的是一个指向a中首次出现b的地址的指针。此处我们为了将地址转换为a数组的索引所以再减去一下a的初始地址。

    二、string类

    1. 定义与输入

    1.1 定义时指定内容

    #include <iostream>
    using namespace std;
    int main() {
        string a = "123";
        cout << a;
    
        return 0;
    }
    
    // 输出:123
    

    此时程序自动在 a[3] 的位置写入了终止符 ''

    与char数组不同,string类型不可以直接通过索引位置定义

    #include <iostream>
    using namespace std;
    int main() {
        string a;
        a[0] = 'A';
        cout << a;
    
        return 0;
    }
    
    // 输出:(空)
    

    但是通过索引进行修改是合法的:

    #include <iostream>
    using namespace std;
    int main() {
        string a = "ABC";
        a[0] = 'a';
        cout << a;
    
        return 0;
    }
    
    // 输出:aBC
    

    1.2 朴素cin

    #include <iostream>
    using namespace std;
    int main() {
        string a;
        // 输入到第一个空格截止
        cin >> a;
        cout << a;
    
        return 0;
    }
    
    // 输入1:123
    // 输出1:123
    
    // 输入2:123 456
    // 输出2:123
    
    // 输入3:123456
    // 输出3:123456
    

    输入同样是从开始到第一个空格,但是与char数组不同的是,string类不会越界或溢出!

    1.3 getline()

    #include <iostream>
    using namespace std;
    int main() {
        char a[3];
        cin.get(a, sizeof(a));  // 第二个参数为a的长度
        cout << a;
    
        return 0;
    }
    
    // 输入:12345
    // 输出:12
    

    cin.get()cin.getline()gets() 对string不适用

    注意:若输入数据一行数字一行字符串直接使用 getline() 会导致读取不到数据,解决方案类似第一部分的1.6

    2. 基本操作

    这部分所有代码使用1.2介绍的朴素cin方式输入

    2.1 获取长度

    #include <iostream>
    using namespace std;
    int main() {
        string a;
        cin >> a;
        cout << a.length();
        // cout << a.size();  // 等价
    
        return 0;
    }
    
    // 输入:123
    // 输出:3
    

    2.2 字符串复制

    #include <iostream>
    using namespace std;
    int main() {
        string a, b;
        cin >> a;
        b = a;
        cout << b;
        
        return 0;
    }
    
    // 输入:12345
    // 输出:12345
    

    真的不能再简单了

    2.3 字符串比较

    #include <iostream>
    using namespace std;
    int main() {
        string a, b;
        cin >> a >> b;
        cout << bool(a > b);
    
        return 0;
    }
    
    // 输入:ef abcd
    // 输出:1
    

    比较的是字典序,字典序的解释如下:

    设想一本英语字典里的单词,何者在前何者在后? 显然的做法是先按照第一个字母、以 a、b、c……z 的顺序排列;如果第一个字母一样,那么比较第二个、第三个乃至后面的字母。如果比到最后两个单词不一样长(比如,sigh 和 sight),那么把短者排在前。

    2.4 字符串连接

    #include <iostream>
    using namespace std;
    int main() {
        string a, b;
        cin >> a >> b;
        cout << a + b;
    
        return 0;
    }
    
    // 输入:Hello World
    // 输出:HelloWorld
    

    嗯,非常Python风格……

    2.5 字符串搜索

    #include <iostream>
    using namespace std;
    int main() {
        string a, b;
        cin >> a >> b;
        cout << a.find(b);
    
        return 0;
    }
    
    // 输入:ababcab abc
    // 输出:2
    

    输出是a中首次出现b的索引

    三、char [] 与 string 相互转换

    1. string 转 char []

    #include <string.h>
    #include <iostream>
    using namespace std;
    int main() {
        string s = "123.123";
        char a[101];
        strcpy(a, s.c_str());
        // strcpy(a, s.data());  // 与上方语句等价,任选其一即可
        cout << a << endl;
    
        return 0;
    }
    

    2. char [] 转 string

    #include <bits stdc++.h="">
    using namespace std;
    int main() {
        char a[100] = "123.123";
        string s = a;
        cout << s;
        return 0;
    }
    

    四、char [] 与 string 转换为数值类型(2021.8.28添加)

    这个内容还烦请移步我的另一篇文章 C++中【字符串】与【整型】和【浮点型】转换全攻略!_异想之旅的博客-CSDN博客


    手写5000字,你看到这里难道还不准备给个三连吗!</string.h>

    异想之旅:本人博客完全手敲,绝对非搬运,全网不可能有重复;本人无团队,仅为技术爱好者进行分享,所有内容不牵扯广告。本人所有文章发布平台为CSDN、博客园、简书和开源中国账号,后期可能会有个人博客,除此之外全部是盗文!本文博客园链接https://www.cnblogs.com/yxzl/p/cpp_string_and_chars.html
  • 相关阅读:
    python-数据结构代码 图(邻接表)
    python-数据结构代码 查找树
    day013内置函数一
    day012生成器函数、生成器表达式、列表推导式
    day011 函数名的运用,闭包,迭代器
    day010 动态传参、函数嵌套、命名空间、作用域
    day009 初识函数
    day008文件操作及应用
    day007深度拷贝和数据补充、set去重、fromkeys
    day006 小数据池,再谈编码
  • 原文地址:https://www.cnblogs.com/yxzl/p/cpp_string_and_chars.html
Copyright © 2011-2022 走看看