第六课:数组与字符串
数组是存储同一类型数据的集合,而字符串是存储字符的特殊数组。掌握数组和字符串是理解复杂数据处理的基础。
数组
数组是存储固定大小、同类型数据的容器。数组的大小一旦定义,便不能改变。
声明
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-z
和 A-Z
的 ASCII 码对照表:
- 小写字母 a-z 的 ASCII 码:
字母 | ASCII 十进制值 | ASCII 十六进制值 |
---|---|---|
a | 97 | 0x61 |
b | 98 | 0x62 |
c | 99 | 0x63 |
d | 100 | 0x64 |
e | 101 | 0x65 |
f | 102 | 0x66 |
g | 103 | 0x67 |
h | 104 | 0x68 |
i | 105 | 0x69 |
j | 106 | 0x6A |
k | 107 | 0x6B |
l | 108 | 0x6C |
m | 109 | 0x6D |
n | 110 | 0x6E |
o | 111 | 0x6F |
p | 112 | 0x70 |
q | 113 | 0x71 |
r | 114 | 0x72 |
s | 115 | 0x73 |
t | 116 | 0x74 |
u | 117 | 0x75 |
v | 118 | 0x76 |
w | 119 | 0x77 |
x | 120 | 0x78 |
y | 121 | 0x79 |
z | 122 | 0x7A |
- 大写字母 A-Z 的 ASCII 码:
字母 | ASCII 十进制值 | ASCII 十六进制值 |
---|---|---|
A | 65 | 0x41 |
B | 66 | 0x42 |
C | 67 | 0x43 |
D | 68 | 0x44 |
E | 69 | 0x45 |
F | 70 | 0x46 |
G | 71 | 0x47 |
H | 72 | 0x48 |
I | 73 | 0x49 |
J | 74 | 0x4A |
K | 75 | 0x4B |
L | 76 | 0x4C |
M | 77 | 0x4D |
N | 78 | 0x4E |
O | 79 | 0x4F |
P | 80 | 0x50 |
Q | 81 | 0x51 |
R | 82 | 0x52 |
S | 83 | 0x53 |
T | 84 | 0x54 |
U | 85 | 0x55 |
V | 86 | 0x56 |
W | 87 | 0x57 |
X | 88 | 0x58 |
Y | 89 | 0x59 |
Z | 90 | 0x5A |
- 规律:
- 小写字母 a-z 的 ASCII 值是从
97
到122
。 - 大写字母 A-Z 的 ASCII 值是从
65
到90
。 - 每个大写字母和对应的小写字母之间相差
32
:- a - A = 97 - 65 = 32
- 因此可以通过简单的加减法在大小写字母之间转换。