Skip to content

第六课:数组与字符串

数组是存储同一类型数据的集合,而字符串是存储字符的特殊数组。掌握数组和字符串是理解复杂数据处理的基础。

数组

数组是存储固定大小、同类型数据的容器。数组的大小一旦定义,便不能改变。

声明

c
数据类型 数组名[数组大小];

示例:

c
int numbers[5];  // 声明一个大小为5的整型数组

初始化

  • 逐个赋值
c
numbers[0] = 10;
numbers[1] = 20;
// ...
  • 直接初始化
c
int numbers[5] = {10, 20, 30, 40, 50};

访问数组元素

数组下标从 0 开始。

c
printf("%d\n", numbers[0]);  // 打印数组的第一个元素

示例代码

计算一个数组内元素的总和:

c
#include <stdio.h>

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += numbers[i];
    }

    printf("Sum of the array: %d\n", sum);

    return 0;
}

字符数组与字符串

字符串的定义

字符串是以 \0(空字符)结尾的字符数组。

示例:

c
char name[10] = "Alice";  // 自动在末尾加上 '\0'

常用字符串处理函数

需要包含头文件 <string.h>

函数功能
strlen(s)返回字符串长度(不含\0)。
strcpy(dest, src)将字符串 src 复制到 dest。
strcat(dest, src)将字符串 src 拼接到 dest 后面。
strcmp(s1, s2)比较字符串 s1 和 s2。返回值:0 表示相等。

示例代码

读取用户的名字并打印其长度:

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

int main() {
    char name[20];
    printf("Enter your name: ");
    scanf("%s", name);  // 不需要加 &

    printf("Hello, %s!\n", name);
    printf("Your name has %lu characters.\n", strlen(name));

    return 0;
}

多维数组

二维数组可用于存储矩阵、表格等。

声明和初始化

c
数据类型 数组名[行大小][列大小];

示例:

c
int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};

访问二维数组元素

c
printf("%d\n", matrix[1][2]);  // 输出第2行第3列的元素:6

示例代码

打印一个 2x3 矩阵:

c
#include <stdio.h>

int main() {
    int matrix[2][3] = {
        {1, 2, 3},
        {4, 5, 6}
    };

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}

综合练习

实现一个程序,统计用户输入的句子中每个字符的出现次数。

代码

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

int main(void) {
    char sentence[100];
    int frequency[26] = {0};  // 用于统计字母出现的次数

    printf("Enter a sentence: ");
    fgets(sentence, sizeof(sentence), stdin);  // 读取整行输入

    for (int i = 0; i < strlen(sentence); i++) {
        if (sentence[i] >= 'a' && sentence[i] <= 'z') {
            frequency[sentence[i] - 'a']++;
        } else if (sentence[i] >= 'A' && sentence[i] <= 'Z') {
            frequency[sentence[i] - 'A']++;
        }
    }

    printf("Character frequencies:\n");
    for (int i = 0; i < 26; i++) {
        if (frequency[i] > 0) {
            printf("%c: %d\n", i + 'a', frequency[i]);
        }
    }

    return 0;
}
a-z,A-Z 的 ASCII 码

以下是英文字母 a-zA-Z 的 ASCII 码对照表:

  • 小写字母 a-z 的 ASCII 码:
字母ASCII 十进制值ASCII 十六进制值
a970x61
b980x62
c990x63
d1000x64
e1010x65
f1020x66
g1030x67
h1040x68
i1050x69
j1060x6A
k1070x6B
l1080x6C
m1090x6D
n1100x6E
o1110x6F
p1120x70
q1130x71
r1140x72
s1150x73
t1160x74
u1170x75
v1180x76
w1190x77
x1200x78
y1210x79
z1220x7A
  • 大写字母 A-Z 的 ASCII 码:
字母ASCII 十进制值ASCII 十六进制值
A650x41
B660x42
C670x43
D680x44
E690x45
F700x46
G710x47
H720x48
I730x49
J740x4A
K750x4B
L760x4C
M770x4D
N780x4E
O790x4F
P800x50
Q810x51
R820x52
S830x53
T840x54
U850x55
V860x56
W870x57
X880x58
Y890x59
Z900x5A
  • 规律:
  1. 小写字母 a-z 的 ASCII 值是从 97122
  2. 大写字母 A-Z 的 ASCII 值是从 6590
  3. 每个大写字母和对应的小写字母之间相差 32
    • a - A = 97 - 65 = 32
    • 因此可以通过简单的加减法在大小写字母之间转换。