• C++语法基础(5)——数组与字符串


    数组

    一维数组

    什么是数组

    • C++使用数组来实现一次性声明很多变量的功能,具有以下特性:
      • 创建后的数组大小固定
      • 同一数组中的元素类型相同
      • 是一系列数据顺序集合
    • 如果把变量比做一个小盒子,每个盒子里装一个数据。那么,数组就像是一整排的盒子,它可以装大量的数据。

    声明数组

    • 在C++中声明数组时,需要指定元素类型数组名称以及数组长度
    元素类型 数组名称[数组长度];
    
    • 1
    • 数组的元素类型只需指定一次,代表整个数组中所有元素的类型
    • 数组长度代表数组容纳元素的数量,必须是一个固定的整型常量,不能是变量
    int sales[6];
    
    • 1

    在声明数组后,内存会为数组分配一块连续的空间。我们可以从内存的角度再来理解一下数组:数组中包含若干个元素,每个元素都是一个变量,因此每个元素都是有地址的,而数组名其实表示的就是第一个元素的起始地址

    访问数组元素

    • 声明一个数组之后,数组中的每个元素可以通过索引来访问
      • 数组的索引的范围是从0到 数组长度-1
      • 数组元素的访问形式是数组名称[索引序号]
    cin >> sales[0];, scanf("%d", &sales[0]);
    cout << sales[0];, printf("%d ", sales[0]);
    sales[0] = 3;
    int a = sales[0];
    sales[0] += 3;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    初始化数组

    • 在C++中,数组的初始化有如下两种方式:
      • 一种初是在声明的同时,使用大括号包含对应数值,直接对整个数组初始化
      • 另一种初始化方式是在声明之后,逐个访问数组元素进行一一初始化赋值
    • 选择直接对整个数组初始化时:
      • 常规int sales[6] = {1, 3, 5, 7, 9, 11}
      • int sales[6] = {1, 3},得到1, 3, 0, 0, 0, 0
      • `int sales[6] = {0} 数组全部初始化为0
      • 可以省略括号中的数组长度 int sales[] = {1, 3, 5, 7, 9, 11}
    • 选择在声明之后对数组中的元素逐个进行初始化赋值时:
    int sales[6];
    for (int i = 0; i < 6; i++) {
        sales[i] = 2 * i + 1;
    }
    
    • 1
    • 2
    • 3
    • 4

    数组输入输出

    • 在C++中,普通的一维数组只能对单个元素进行输入输出。
    int sales[6] = {0};
    cin >> sales[0];
    scanf("%i", &sales[1]);
    
    cout << sales_4[0];
    printf("%i", sales[1]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    多维数组

    声明二维数组

    元素类型 数组名称[数组第一个维度长度][数组第二个维度长度]
    
    • 1
    int scores[5][3];
    
    • 1

    二维数组访问元素

    通过scores[1]访问第2个数组,再通过scores[1][2]访问该数组的第3个元素

    初始化二维数组

    int scores[5][3] = {  
     {8, 4, 6} ,   /*  初始化索引号为 0 的行 */
     {5, 6, 3} ,   /*  初始化索引号为 1 的行 */
     {3, 2, 4} ,   /*  初始化索引号为 2 的行 */
     {8, 7, 6} ,   /*  初始化索引号为 3 的行 */
     {7, 9, 8} ,   /*  初始化索引号为 4 的行 */
    };
    
    // 或者省略掉第二层的大括号
    int scores[5][3] = {8, 4, 6, 5, 6, 3, 3, 2, 4, 8, 7, 6, 7, 9, 8};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    int scores[5][3];
    for (int i = 0; i < 5; i++) {
        for (int j = 0; j < 3; j++) cin >> scores[i][j];
    }
    
    • 1
    • 2
    • 3
    • 4

    二维数组的输入输出

    • 在C++中,和一维数组一样,普通的二维数组也只能对单个元素进行输入输出。
    int scores[5][3] = {0};
    
    cin >> scores[0][0];
    scanf("%i", &scores[0][1]);
    
    cout << scores[0][0];
    printf("%i", scores[0][1]);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    多维数组的用法在这里插入图片描述

    • 小键发现在第二轮,评委1对选手1还没有打分,想要在使用-1初始化后,再通过输入修正分数;
    • 对于修正后的数组,小键需要逐个输出每个选手的得分,并计算输出每位选手的平均得分(向下取整)。
    // 声明并初始化得分,第二轮此时评委1对选手1还没有打分
    int scores[5][3][2] = {
        {{8, -1}, {4, 3}, {6, 5}},
        {{5, 6}, {6, 5}, {3, 8}},
        {{3, 8}, {2, 9}, {4, 7}},
        {{8, 7}, {7, 5}, {6, 3}},
        {{7, 7}, {9, 7}, {8, 9}}
    };
    
    int avg_score, score_sum;
    
    // 通过输入修正分数
    scanf("%i", &scores[0][0][1]);
    
    for (int i=0; i<5; i++) {
        score_sum = 0;
        cout << "选手" << (i+1);
        
        // 对该选手的每一轮打印分数并统计平均分
        for (int k=0; k<2; k++){
            cout << "第" << (k+1) << "轮得分:";
            avg_score = 0;
            
            // 计算该选手在该轮的平均分
            for (int j=0; j<3; j++) {
                avg_score += scores[i][j][k];
                cout << scores[i][j][k] << " ";
            }
            cout << endl;
            avg_score /= 3;
            
            // 该选手的总得分加上该轮的平均分
            score_sum += avg_score;
        }
        
        cout << score_sum << endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    字符串

    字符串,比如:"XiaoMing""LaoWang""HanMeimei"等。
    由于字符变量能存储一个字符,对于一个字符串,可以用类型是char的数组来存储,这类数组称为字符数组。

    字符数组

    字符数组与字符串

    • 由一系列字符组成的一个处理单位称为字符串,如一个单词或一个句子。
      • C++ 中的字符串常量是用一对双引号括起来,由 '\0' 作为结束符的一组字符。
    • 不含任何字符的字符串称为空字符串,用一对双引号表示,即""。空字符串并不是不占空间,而是占用了 11 字节的空间,这个字节中储存了一个'\0'
    • 通常用一个字符数组来保存字符串,即所有元素的类型都是字符型的数组
      • 由于字符串以 '\0' 作为结束符,因此所需的储存空间比实际的字符串长度大1。
        Tips:在 C++ 中,'a'"a" 是不一样的,前者是一个字符常量,在内存中占 1 字节,后者是一个字符串,占 2 字节的空间,第 1 个字节储存了字母 a 的内码值,第二个字节储存了 '\0'
    • char userName[11]就可以声明一个名字叫userName的字符数组型字符串,这个数组最多能存放一个长度为10的字符串。
      初始化
    • 字符数组初始化的程序段(一)
    // 第一种:给每个元素指定初始化值
    // 依次赋初值,剩下的会默认被初始化为\0
    char userName[11] = {'L', 'a', 'o', 'W', 'a', 'n', 'g', '\0'};
    char userName[11] = {'L', 'a', 'o', 'W', 'a', 'n', 'g'};
    
    // 和普通数组一样,元素个数可以省略,c++会自动识别长度为8
    char userName[] = {'L', 'a', 'o', 'W', 'a', 'n', 'g', '\0'};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 第二种是使用字符串常量初始化字符数组
    //第二种:使用字符串常量初始化字符数组
    char userName[11] = {"LaoWang"};
    // 大括号可以省略
    char userName[11] = "LaoWang";
    
    • 1
    • 2
    • 3
    • 4

    字符数组的输入输出

    • 方式一:使用cincout
    char ch[11];
    cin >> ch;
    
    • 1
    • 2
     - 输入的时候,使用`cin`语句,会不断的读入字符串,直到遇到一个空白字符(空格、回车或者制表符)就结束读入
     - 用`cin`向计算机输入一串字符时,输入的字符的数量应该少于已定义的字符数组的长度,否则会出现问题
     - 如果输入的字符的数量小于字符数组长度时,剩下的部分会默认补上`'\0'`
    
    • 1
    • 2
    • 3
    cout << ch;
    
    • 1
     - 从字符数组的第一个字符开始输出,直到遇到 `'\0'`(不会输出`'\0'`)
     - 如果一个字符数组中包含一个以上`'\0'`,则遇第一个`'\0'`时`cout`输出就结束
    
    • 1
    • 2
    • 方式二:用scanf printf也可以输入输出字符串
    • 字符的输入用scanf("%c", &变量名),而输入一个字符串用scanf("%s", 数组名)
    scanf("%s", userName);
    
    • 1
    • 注意,因为是字符串也是一个字符数组,scanf里,数组前不需要加&,只有变量名字需要加&

    • 字符的输出用 printf("%c", &变量名),而输出一个字符串用printf("%s", 数组名)

    printf("%s", userName);
    
    • 1

    字符数组型字符串的常用操作

    • 连接字符串 使用strcat(s1, s2)函数可以把字符串s2 连接到s1的末尾。
    • 获取字符串长度 使用strlen(s1)函数可以返回字符串s1的有效字符数。比如"yes"的长度就是3。
    • 比较字符串的字典序 使用strcmp(s1, s2)函数可以比较两个字符串之间的字典序:如果s1s2是相同的,会返回0;如果s1的字典序在s2前面,则返回值会小于0;如果s1的字典序在s2后面,则返回值会大于0。
    • 复制字符串 使用strcpy(s1, s2)函数可以复制字符串 s2到字符串s1。如果s2s1短,那么s1这个数组后面没被覆盖的部分不会改变。比如s1存的是{q, w, e, r, \0}, s2存的是{a, s, \0},那么使用strcpy(s1, s2)后,s1前五位应该是{a, s, \0, r, \0}
  • 相关阅读:
    用了4年,终于发现了这款国产报表工具的魅力
    【Linux详解】冯诺依曼架构 | 操作系统设计 | 斯坦福经典项目Pintos
    一文讲清Java中的四种引用类型的区别(关于弱引用是如何解决ThreadLocal内存泄漏问题)
    Debian linux系统更换apt源
    Uniapp连接iBeacon设备——实现无线定位与互动体验(理论篇)
    企业级高负载WEB服务器—Tomcat
    【SemiDrive源码分析】【MailBox核间通信】47 - 分析RPMSG_IPCC_RPC 方式 单次传输的极限大小 及 极限带宽测试
    接口测试流程
    Dart:补充
    Java几种文件拷贝方式
  • 原文地址:https://blog.csdn.net/qq_44941689/article/details/125564108