内容正文:
6.3节:字符数组
C语言程序设计
电子工业出版社
掌握字符数组的定义、初始化、输入输出及常用函数
运用字符数组解决实际问题,阅读分析程序
培养逻辑思维与规范的编程习惯
知识目标
能力目标
素养目标
01
01
01
学习目标
目录
Part 01
教学导入
Part 02
知识讲授
Part 03
师生互动
Part 04
课堂练习
Part 05
课堂小结
教学导入:从问题到思考
我们知道单个字符变量无法存储完整的字符串,那么如何高效地存储和处理像'Hello, World!'这样的字符序列呢?答案就是——字符数组。
教学导入
代码示例
charstr[] ="Hello";
概念解析
这就是一个字符数组,它可以用来存储字符串。
在 C 语言中,字符串本质上是由一系列字符组成的数组,以'\0'作为结束标志。
关键点:字符数组是处理文本数据的基础,理解它对于掌握字符串操作至关重要。
教学导入
字符串 "Hello" 在内存中是如何存储的呢?我们通过下图来直观理解:
💡 关键点:每个字符连续存储,末尾自动添加结束标志 '\0'
知识讲授
字符数组
字符数组的定义、引用及输入输出
字符串处理函数及字符数组应用实例
第一部分
字符数组的定义、引用及输入输出
知识讲授
知识讲授:字符数组的定义
一维字符数组
定义格式:char 数组名[常量表达式];
chara[5];// 定义一个长度为5的字符数组a
二维字符数组
定义格式:char 数组名[常量表达式1][常量表达式2];
chara[2][3];// 定义一个2行3列的字符数组a
核心提示:字符数组的定义与普通数组类似,但元素类型固定为char。一维数组用于存储单个字符串,二维数组可看作字符串的数组。
知识讲授:字符数组的初始化
方式一:逐个元素初始化
char a[10] = {'H', 'e', 'l', 'l', 'o'};
逐个赋值时,未赋值的元素系统会自动补为'\0'。
方式二:用字符串常量初始化
char a[] = "Hello";
使用双引号时,系统自动在末尾添加'\0',数组长度为6。
关键点总结:
'\0' 是字符串的结束标志,占用一个字节的存储空间。使用第二种方式(字符串常量)比第一种更简洁,也是编程中最常用的方式。
知识讲授:字符数组元素的引用
引用格式
通过下标访问单个字符,下标从 0 开始:
数组名[下标];
代码示例
char str[] = "Hello";
printf("%c", str[0]);// 输出 'H'
printf("%c", str[1]);// 输出 'e'
内存结构可视化
'H'
str[0]
'e'
str[1]
'l'
str[2]
'l'
str[3]
'o'
str[4]
字符数组在内存中是连续存储的。每个字符占用一个字节。通过下标访问时,实际上是计算相对于数组起始地址的偏移量。
知识讲授:字符串和字符串结束标志
核心作用
标识字符串的结束位置,告诉程序在哪里停止读取字符。
存储特性
占用1个字节存储空间,但不计入字符串的实际长度。
自动添加
使用双引号 "" 定义字符串常量时,系统会自动在末尾追加。
内存存储示意图:以 "Hello" 为例
注意:如果没有 '\0',程序可能会读取到内存中的随机垃圾值
知识讲授:字符数组的输入/输出(单个字符)
输入单个字符
char c; // 定义字符变量
scanf("%c", &c); // 使用 %c 格式符输入
输出单个字符
// 假设 c 已被赋值
printf("%c", c); // 使用 %c 格式符输出
应用场景:结合循环处理字符数组
通过循环结构(如 for 循环),利用上述单个字符的输入输出方法,可以遍历整个字符数组,实现逐个读写。
for (int i = 0; i < len; i++) { scanf("%c", &arr[i]); } // 逐个输入数组元素
知识讲授:字符数组的输入/输出(字符串)
输入字符串
charstr[10];
scanf("%s", str);
// 注意:str前不需要加 & 符号
输出字符串
printf("%s", str);
// 直接输出整个字符串,直到遇到 '\0'
⚠️ 重要注意事项
函数scanf("%s")在读取字符串时,遇到空格、制表符或回车键会自动停止输入。因此,它无法读取包含空格的字符串。
背诵记忆
字符数组的定义格式
格式:char 数组名[长度];
例如:char str[10];
初始化方式
1. 逐个赋值:char s[3] = {'a','b','c'};
2. 字符串赋值:char s[] = "abc";
字符串结束标志
标志:'\0' (ASCII码值为0)
特点:使用字符串赋值时由系统自动添加。
输入输出方法
单个字符:使用格式符%c
整个字符串:使用格式符%s
Tip:使用字符串初始化时,数组长度需预留一位给结束标志'\0'。
课堂问答
问题 1:字符数组和普通数组有什么区别?
字符数组是数组的一种特殊形式,其元素类型为 char,专门用于存储字符数据。普通数组可以存储 int、float 等多种类型的数据。
问题 2:为什么需要字符串结束标志 '\0'?
'\0' 用于标识字符串的结束,使得程序能够正确识别字符串的长度和范围,避免访问数组越界。
例题分析(一)
程序文本【6.8】输出一个字符串
#include<stdio.h>
intmain()
{
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
//定义并初始化字符数组 c[10]
int i;
for(i=0; i<10; i++)//使用 for 循环遍历数组索引 0-9
printf("%c", c[i]);//通过 printf("%c", c[i]) 逐个输出字符
printf("
");
}
/*字符数组的本质是一系列连续的字符存储单元。本程序演示了如何不依赖字符串结束符 '\0' 而仅通过下标控制来输出字符串*/
例题分析(一)
例题分析(二)
程序文本【6.9】由键盘输入字符串“china”并输出。
#include <stdio.h>
main()
{
int i;
char c[5]; //定义字符数组,内含5个元素
for(i=0; i<5; i++)
scanf("%c", &c[i]); /*循环逐个读取用户输入的字符并存储到字符数组 c 中*/
for(i=0; i<5; i++)
printf("%c", c[i]); /*循环遍历数组,将存储的字符逐个输出到控制台*/
printf("
");
}
例题分析(二)
课堂练习
题目要求
任务描述:
输入一个字符串,输出其长度。
核心限制:
禁止直接使用标准库中的strlen()函数。
考察目标:
“数组遍历”与“循环计数”。
提示:可以通过scanf或gets读取字符串,利用while循环检查字符串结束符'\0'来计算长度。
假
输出长度:len
假
len++;
str[len] !='\0'
结束
输入:数组元素
char str[100];
int len=0;
开始
课堂练习
程序文本
#include <stdio.h>
main()
{
char str[100];
int len = 0;
scanf("%s", str);
while(str[len] !='\0')
len++;
printf("字符串长度为:%d
", len);
}
课堂练习
第二部分
知识讲授
字符串处理函数及字符数组应用实例
知识讲授:puts()和gets()
知识讲授:字符串输出函数——puts( )
函数格式:puts(字符数组名);
核心功能:
将指定字符数组中的字符串输出到显示器,并自动在末尾添加换行符。
代码示例:
char str[] = "Hello";// 定义字符串
puts(str);// 输出 "Hello" 并自动换行
知识讲授:字符串输入函数——gets( )
函数格式:gets(字符数组名);
功能说明:从键盘输入一个字符串到字符数组中,直到遇到回车为止。
代码示例:
char str[100];
gets(str); // 可以输入包含空格的字符串,如 "Hello World"
知识讲授:字符串连接函数——strcat( )
知识讲授:字符串连接函数——strcat( )
函数格式:strcat(字符数组名1, 字符数组名2);
核心功能:将字符数组2的字符串追加到字符数组1末尾,并覆盖结束符。
重要注意事项:在连接时,系统会自动删除字符串s1后的‘\0’,然后将字符串s2的内容连接起来,并在连接后的字符串末尾添加‘\0’标志。
代码示例
char s1[12]=“thank”;
s2[ ]=“you”;
strcat(s1,s2);
puts(str1);
s1 t h a n k \0 \0 \0 \0 \0 \0 \0
s2 y o u \0 \0 \0 \0
strcat(s1,s2) t h a n k y o u \0 \0 \0 \0
知识讲授:字符串复制函数——strcpy( )
知识讲授:字符串复制函数——strcpy( )
代码示例
char s1[12]="thank you! ",
char s2[ ]="hello!";
strcpy (s1, s2 );
puts(str1);
s1 t h a n k □ y o u ! \0 \0
s2 h e l l o ! \0
strcpy(s1,s2) h e l l o ! \0 o u ! \0 \0
函数格式
strcpy(字符数组名1, 字符数组名2);
函数功能
将字符数组2中的字符串(含'\0')完整复制到字符数组1中。
注意:目标字符数组(数组1)必须定义足够的长度,以容纳源字符串,防止内存溢出。
知识讲授:字符串比较函数——strcmp( )
知识讲授:字符串比较函数——strcmp( )
函数格式
strcmp(字符数组名1, 字符数组名2);
功能与返回值规则
按ASCII码顺序逐字符比较,直到出现不同字符或结束。
返回0:字符串1 等于 字符串2
返回正数:字符串1 大于 字符串2
返回负数:字符串1 小于 字符串2
程序文本【6.15】
#include <stdio.h>
#include<string.h>
main()
{
int k;
char st1[15],st2[]="c Language";
printf("input a string:
");
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf("st1=st2
");
if(k>0) printf("st1>st2
");
if(k<0) printf("st1<st2
");
}
知识讲授:字符串比较函数——strcmp( )
知识讲授:字符串长度函数——strlen( )
知识讲授:字符串长度函数——strlen( )
程序文本【6.16】
#include <stdio.h>
#include<string.h>
main()
{
int k;
static char st[]="c language";
k=strlen(st);
printf("The length of the string is %d
",k);
}
函数格式
strlen(字符数组名);
核心功能
返回字符串的实际长度,不包括结束标志 '\0'。
代码示例
char str[] = "Hello";// 实际存储: 'H','e','l','l','o','\0'
int len = strlen(str);// len = 5,仅统计有效字符
知识讲授:字符串长度函数——strlen( )
例题分析(一)
题目要求:
由键盘输入一个字符串,复制到另一字符数组后显示出来。
核心知识点分析
通过while循环逐个字符复制,最后手动添加'\0'结束标志,模拟了标准库函数strcpy的底层实现逻辑。
例题分析(一)
程序文本【6.17】由键盘输入一个字符串,复制到另一字符数组后显示出来
#include<stdio.h>
#include<string.h>
main()
{ char str1[30], str2[30];// 定义两个字符数组
int i;// 初始化循环变量
printf("Input a string: ");
scanf("%s", str1);
i=0;
while(str1[i]!='\0')
{ str2[i] = str1[i];
i++; } // 循环复制字符
str2[i] ='\0';
printf("%s
", str2); }
例题分析(一)
例题分析(二)
题目要求:由键盘输入一个字符串,要求从该字符串中删去一个指定的字符。
核心思路分析:
1. 双数组处理:利用两个字符数组,一个存储原始输入,一个存储处理后的结果。
2. 遍历与筛选:通过循环遍历原字符串,判断当前字符是否为目标删除字符。若不是,则将其复制到新数组中。
3. 注意事项:操作完成后,务必在新字符串末尾手动添加字符串结束符 `\0`,否则可能导致输出乱码。
例题分析(二)
程序文本【6.18】由键盘输入一个字符串,要求从该字符串中删去一个字符。
#include<stdio.h>
#include<string.h>
main()
{ char str1[50],str2[50];
int i=0;int k=0;char ch;
gets(str1);
printf("
delete?");
scanf("%c",&ch);
for(i=0;str1[i]!='\0';i++)
{ if(str1[i]!=ch) str2[i-k]=str1[i];
else k=k+1; }
str2[i-k]='\0';
printf("
%s
",str2);
}
例题分析(二)
背诵记忆
puts()
输出字符串并换行
gets()
输入字符串(注意安全)
strcat()
连接两个字符串
strcpy()
复制字符串
strcmp()
比较两个字符串
strlen()
获取字符串长度
提示:熟练掌握这些核心函数是编写高效 C 语言程序的基础,请务必结合实际案例多加练习。
课堂问答
问题 1:strcpy 和 strcat 函数有什么区别?
答案:strcpy 是将一个字符串复制到另一个字符串中,会覆盖目标字符串的原有内容;strcat 是将一个字符串连接到另一个字符串的末尾,目标字符串的原有内容会保留。
问题 2:如何比较两个字符串是否相等?
答案:使用 strcmp 函数,如果返回值为 0,则两个字符串相等。
课堂练习
题目要求:
输入两个字符串,比较它们的大小并输出结果(提示:可使用 strcmp 函数)。
课堂练习
程序文本
#include<stdio.h>
#include<string.h>
main()
{
char str1[100], str2[100];
int result;
printf("请输入第一个字符串:");
scanf("%s", str1);
printf("请输入第二个字符串:");
scanf("%s", str2);
result = strcmp(str1, str2);
if(result= =0) printf("两个字符串相等。
");
else if(result>0) printf("第一个字符串更大。
");
else printf("第二个字符串更大。
");
}
课堂练习
课堂小结
字符数组基础
掌握字符数组的定义、初始化方法,以及数组元素的引用、输入和输出操作。
字符串结束标志 '\0'
理解 '\0'(空字符)在C语言字符串中的核心作用,它是系统判断字符串结束的依据。
常用字符串处理函数
熟练使用 puts, gets, strcat, strcpy, strcmp, strlen 等标准库函数进行操作。
字符数组综合应用
能够结合循环、判断结构,运用字符数组和处理函数解决简单的编程实际问题。
核心目标:掌握基础,理解原理,灵活运用函数解决实际问题
课堂小结
课后任务
作业 1:字符统计
编写程序,统计一个字符串中某个指定字符出现的次数。
作业 2:字符串拼接
编写程序,将两个字符串拼接起来(要求不使用 strcat 函数)。
作业 3:回文字符串判断
编写程序,判断一个字符串是否为回文字符串(即正读和反读都一样)。
谢谢观看
THANKS
$