Clanguagearray and stringtutorial

LearningClanguagearray 声明, 初始化, 访问, 以及string processing and 常用function

返回tutoriallist

1. arrayoverview

1.1 what is array

array is adatastructure, 用于store相同class型 many 个元素. in Clanguagein, array is 一组连续 memory位置, 每个位置都可以store一个值. array 每个元素都可以throughindex ( under 标) 来访问, index from 0开始.

array 主要特点:

  • 所 has 元素 class型必须相同
  • 元素 in memoryin is 连续store
  • 可以throughindex fast 速访问任意元素
  • array big small in 声明时确定, 之 after 不能改变

1.2 array 声明

in Clanguagein, 声明array basic语法such as under :

dataclass型 array名[array big  small ];

// example
int numbers[10];      // 声明一个package含10个整数 array
float scores[5];      // 声明一个package含5个浮点数 array
char grades[20];      // 声明一个package含20个字符 array

其in:

  • dataclass型: array元素 class型
  • array名: array 名称, 遵循标识符命名规则
  • array big small : array可以store 元素个数, 必须 is a 常量表达式

2. array 初始化

2.1 初始化method

in 声明array时, 可以同时 for 其for初始化:

2.1.1 完全初始化

// 完全初始化
int numbers[5] = {1, 2, 3, 4, 5};
float scores[3] = {95.5, 87.5, 92.0};
char grades[4] = {'A', 'B', 'C', 'D'};

2.1.2 部分初始化

// 部分初始化, 未初始化 元素会被自动设置 for 0
int numbers[5] = {1, 2, 3};  // etc.价于 {1, 2, 3, 0, 0}
float scores[3] = {95.5};    // etc.价于 {95.5, 0.0, 0.0}

2.1.3 省略array big small 初始化

// 省略array big  small , 编译器会根据初始化list  long 度自动计算
int numbers[] = {1, 2, 3, 4, 5};  // array big  small  for 5
float scores[] = {95.5, 87.5};     // array big  small  for 2

2.2 array 访问

array元素可以throughindex来访问 and modify, index from 0开始:

#include <stdio.h>

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    
    // 访问array元素
    printf("第一个元素: %d\n", numbers[0]);
    printf("第三个元素: %d\n", numbers[2]);
    
    // modifyarray元素
    numbers[1] = 10;
    printf("modify after  第二个元素: %d\n", numbers[1]);
    
    return 0;
}

run结果:

第一个元素: 1
第三个元素: 3
modify after  第二个元素: 10

2.3 array 遍历

通常using循环来遍历array 所 has 元素:

#include <stdio.h>

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};
    int i;
    
    // usingfor循环遍历array
    printf("array元素: ");
    for (i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");
    
    return 0;
}

run结果:

array元素: 1 2 3 4 5

3. many 维array

3.1 二维array

二维array is array array, 可以看作 is a 表格, has 行 and 列. 声明二维array 语法such as under :

dataclass型 array名[行数][列数];

// example
int matrix[3][4];    // 声明一个3行4列 整数二维array
float scores[5][3];  // 声明一个5行3列 浮点数二维array

3.2 二维array 初始化

// 二维array 初始化
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};

// 也可以using简化 初始化方式
int matrix2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

// 部分初始化
int matrix3[3][4] = {
    {1, 2},
    {5},
    {9}
};  // 未初始化 元素会被自动设置 for 0

3.3 二维array 访问

#include <stdio.h>

int main() {
    int matrix[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };
    int i, j;
    
    // 访问二维array元素
    printf("第2行第3列 元素: %d\n", matrix[1][2]);
    
    // modify二维array元素
    matrix[0][0] = 100;
    printf("modify after  第1行第1列 元素: %d\n", matrix[0][0]);
    
    // 遍历二维array
    printf("二维array 所 has 元素:\n");
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

run结果:

第2行第3列 元素: 7
modify after  第1行第1列 元素: 100
二维array 所 has 元素:
100 2 3 4 
5 6 7 8 
9 10 11 12 

4. string

4.1 string concepts

in Clanguagein, string is 由字符组成 array, 以空字符 ('\0') 结尾. 空字符 is a 特殊 字符, 其ASCII值 for 0, 用于标记string 结束.

string 声明 and 初始化:

// method1: using字符array初始化
char message1[10] = {'H', 'e', 'l', 'l', 'o', '\0'};

// method2: usingstring字面量初始化 (推荐) 
char message2[] = "Hello";

// method3: 指定array big  small 
char message3[10] = "Hello";

当usingstring字面量初始化字符array时, 编译器会自动 in 末尾添加空字符.

4.2 string 输入 and 输出

#include <stdio.h>

int main() {
    char name[50];
    
    // 输出string
    printf("请输入你 名字: ");
    
    // 输入string (注意: scanf会 in 遇 to 空格时停止读取) 
    scanf("%s", name);
    
    // 输出string
    printf("你 good , %s!\n", name);
    
    return 0;
}

such as果要读取package含空格 string, 可以usingfgetsfunction:

#include <stdio.h>

int main() {
    char name[50];
    
    // 输出提示information
    printf("请输入你 全名: ");
    
    // 输入string (可以package含空格) 
    fgets(name, sizeof(name), stdin);
    
    // 输出string
    printf("你 good , %s!\n", name);
    
    return 0;
}

4.3 stringprocessingfunction

Clanguageproviding了一组stringprocessingfunction, 定义 in string.h头filein. 常用 stringprocessingfunctionincluding:

4.3.1 strlen - 计算string long 度

#include <stdio.h>
#include <string.h>

int main() {
    char message[] = "Hello, World!";
    int length;
    
    length = strlen(message);
    printf("string long 度: %d\n", length);
    
    return 0;
}

run结果:

string long 度: 13

4.3.2 strcpy - copystring

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello";
    char destination[20];
    
    strcpy(destination, source);
    printf("目标string: %s\n", destination);
    
    return 0;
}

run结果:

目标string: Hello

4.3.3 strcat - 连接string

#include <stdio.h>
#include <string.h>

int main() {
    char str1[20] = "Hello";
    char str2[] = " World!";
    
    strcat(str1, str2);
    printf("连接 after  string: %s\n", str1);
    
    return 0;
}

run结果:

连接 after  string: Hello World!

4.3.4 strcmp - 比较string

#include <stdio.h>
#include <string.h>

int main() {
    char str1[] = "apple";
    char str2[] = "banana";
    char str3[] = "apple";
    int result;
    
    result = strcmp(str1, str2);
    printf("strcmp(str1, str2) = %d\n", result);
    
    result = strcmp(str1, str3);
    printf("strcmp(str1, str3) = %d\n", result);
    
    result = strcmp(str2, str1);
    printf("strcmp(str2, str1) = %d\n", result);
    
    return 0;
}

run结果:

strcmp(str1, str2) = -1
strcmp(str1, str3) = 0
strcmp(str2, str1) = 1

strcmpfunction return value:

  • such as果第一个string small 于第二个string, 返回负值
  • such as果两个string相etc., 返回0
  • such as果第一个string big 于第二个string, 返回正值

实践case: 学生成绩managementsystem

writing一个C程序, usingarraystore学生 成绩, 并计算平均分, 最 high 分 and 最 low 分.

requirementsanalysis

  • store5个学生 成绩
  • 计算平均分
  • 找出最 high 分
  • 找出最 low 分
  • 输出所 has 成绩 and statistics结果

referencecode

#include <stdio.h>

int main() {
    int scores[5];
    int i;
    int sum = 0;
    int max, min;
    float average;
    
    // 输入学生成绩
    printf("请输入5个学生 成绩: \n");
    for (i = 0; i < 5; i++) {
        printf("学生%d: ", i + 1);
        scanf("%d", &scores[i]);
        sum += scores[i];
    }
    
    // 计算平均分
    average = (float)sum / 5;
    
    // 找出最 high 分 and 最 low 分
    max = scores[0];
    min = scores[0];
    for (i = 1; i < 5; i++) {
        if (scores[i] > max) {
            max = scores[i];
        }
        if (scores[i] < min) {
            min = scores[i];
        }
    }
    
    // 输出结果
    printf("\n成绩statistics:\n");
    printf("所 has 成绩: ");
    for (i = 0; i < 5; i++) {
        printf("%d ", scores[i]);
    }
    printf("\n");
    printf("平均分: %.2f\n", average);
    printf("最 high 分: %d\n", max);
    printf("最 low 分: %d\n", min);
    
    return 0;
}

run结果

请输入5个学生 成绩: 
学生1: 85
学生2: 92
学生3: 78
学生4: 95
学生5: 88

成绩statistics:
所 has 成绩: 85 92 78 95 88 
平均分: 87.60
最 high 分: 95
最 low 分: 78

互动练习

练习1: writing一个C程序, usingarraystore10个整数, 然 after 计算它们 and and 平均值.

提示: using循环输入10个整数, 然 after 计算它们 and , 最 after 计算平均值.

练习2: writing一个C程序, using二维arraystore一个3x3 矩阵, 然 after 计算矩阵 转置.

提示: 矩阵 转置 is 将矩阵 行 and 列互换.

练习3: writing一个C程序, usingstringstoreuser输入 句子, 然 after statistics句子in单词 个数.

提示: 可以throughstatistics空格 个数来计算单词 个数, 注意句子开头 and 结尾 空格.