第六课:数组与字符串
数组是存储同一类型数据的集合,而字符串是存储字符的特殊数组。掌握数组和字符串是理解复杂数据处理的基础。
数组
数组是存储固定大小、同类型数据的容器。数组的大小一旦定义,便不能改变。
声明
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
- 因此可以通过简单的加减法在大小写字母之间转换。