白 雪 飞
baixf@ustc.edu.cn
中国科学技术大学电子科学与技术系
Dept,of Elec,Sci,& Tech.,USTC
Fall,2003
第 4章 数 组
C语言程序设计 - 第 4章 数组 2
目 录
? 数组的概念
? 一维数组
? 二维数组
? 字符数组
C语言程序设计 - 第 4章 数组 3
数组 (Array)
? 概念
?有序数据的集合
? 说明
?数组中的每一个元素都属于同一数据类型
?用统一的数组名和下标来唯一的确定数组中
的元素
?数组元素的类型可以是基本类型或导出类型
C语言程序设计 - 第 4章 数组 4
一维数组
? 一维数组的定义
? 一维数组元素的引用
? 一维数组的存储形式
? 一维数组的初始化
? 一维数组程序举例
C语言程序设计 - 第 4章 数组 5
一维数组的定义
? 定义形式
?类型 数组名 [常量表达式 ];
? 说明
?常量表达式表示数组的大小 (元素个数 )
?数组大小只能是常量,不能包含变量
?整型数组与整型是两种不同的数据类型
? 举例
?int a[100],b[3*2];
C语言程序设计 - 第 4章 数组 6
一维数组元素的引用
? 引用形式
?数组名 [下标 ]
? 说明
?下标是整型表达式
?数组元素与同类型的变量使用方法相同
?数组下标范围为 0~N-1(N为数组长度 )
?注意防止数组下标越界
? 举例
?a[0]=a[5]+a[j]*3;
C语言程序设计 - 第 4章 数组 7
一维数组的存储形式
? 一维数组的元素在内存中依次连续存储
低地址,..
a[0]
a[1]
a[2]
a[3]
a[4]
高地址,..
char a[5];
C语言程序设计 - 第 4章 数组 8
一维数组的初始化
? 定义数组时对数组元素赋初值
?int a[5]={1,2,3,4,5};
? 只给部分元素赋初值
?int a[5]={1,2,3};
?int a[5]={0};
?其余元素初值为零
? 对全部元素赋初值时,可以不指定长度
?int a[]={1,2,3,4,5};
C语言程序设计 - 第 4章 数组 9
一维数组程序举例
? Fibonacci数列
? 冒泡排序法
? 筛法求素数
)3(
1
12
21
???
??
?? nFFF
FF
nnn
C语言程序设计 - 第 4章 数组 10
例 1,Fibonacci数列 (04-01.C)
#include <stdio.h>
void main()
{
int i,f[20]={1,1};
for (i=2; i<20; i++)
f[i] = f[i-2] + f[i-1];
}
C语言程序设计 - 第 4章 数组 11
例 2:冒泡排序法 (04-02.C)
? 两层循环结构
? 外层循环每次把操作
范围内最大的数放到
最后位置
? 内层循环每次把较大
的数放到靠后的位置
? 确定每层循环的边界
? 外层循环 n-1次
j=0 to n-2
? 内层循环 n-1-j次
i=0 to n-2-j
5
2
8
4
6
3
2
5
4
6
3
8
2
4
5
3
6
8
2
4
3
5
6
8
2
3
4
5
6
8
2
3
4
5
6
8
?
? ? ? ?
5
2
8
4
6
3
2
5
8
4
6
3
2
5
8
4
6
3
2
5
4
8
6
3
2
5
4
6
8
3
2
5
4
6
3
8
C语言程序设计 - 第 4章 数组 12
例 2:冒泡排序法 (续 ) 真 假
输 入 n 个 数 到 a [ 0 ] ~ a [ n - 1 ]
f o r j = 0 t o n - 2
输 出 a [ 0 ] ~ a [ n - 1 ]
f o r i = 0 t o n - j - 2
a [ i ] > a [ i + 1 ]
a [ i ] ? a [ i + 1 ]
C语言程序设计 - 第 4章 数组 13
例 3:筛法求素数 (04-03.C)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
C语言程序设计 - 第 4章 数组 14
例 3:筛法求素数 (续 )
#define MAX 100
...,..
for (i=2; i<MAX; i++)
s[i]=1; /* 初始化,所有数都在筛子中 */
for (i=2; i<MAX; i++)
if (s[i])
for (m=2*i; m<MAX; m+=i)
s[m]=0; /* 从筛子中筛去 */
...,..
C语言程序设计 - 第 4章 数组 15
二维数组
? 二维数组的定义
? 二维数组的存储形式
? 二维数组元素的引用
? 二维数组的初始化
? 二维数组与一维数组
? 二维数组程序举例
C语言程序设计 - 第 4章 数组 16
二维数组的定义
? 定义形式
?类型 数组名 [常量表达式 ][常量表达式 ];
?可以看作元素是一维数组的一维数组
? 举例
?char a[3][4]; /* 3行 4列 */
?
?
?
?
?
?
?
?
?
a[2][3]a[2][2],a[2][1],a[2][0],a[2]
a[1][3]a[1][2],a[1][1],a[1][0],a[1]
a[0][3]a[0][2],a[0][1],a[0][0],a[0]
a
C语言程序设计 - 第 4章 数组 17
二维数组的存储形式
? 按行存放,先行后列
char a[3][4];
低地址,..
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
高地址
a[2][2]
a[2][3]
...
a [ 0 ] [ 0 ] a [ 0 ] [ 1 ] a [ 0 ] [ 2 ] a [ 0 ] [ 3 ]
a [ 1 ] [ 0 ] a [ 1 ] [ 1 ] a [ 1 ] [ 2 ] a [ 1 ] [ 3 ]
a [ 2 ] [ 0 ] a [ 2 ] [ 1 ] a [ 2 ] [ 2 ] a [ 2 ] [ 3 ]
C语言程序设计 - 第 4章 数组 18
二维数组元素的引用
? 表示形式
?数组名 [下标 ][下标 ]
? 说明
?用法与一维数组元素类似
?注意避免下标越界
?char a[3][4];
a[1][5] ? a[2][1]
低地址,..
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[1][5] ? a[2][1]
高地址
a[2][2]
a[2][3]
...
C语言程序设计 - 第 4章 数组 19
二维数组的初始化 (1)
? 分行给二维数组赋初值
? int a[3][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
? 对部分元素赋初值
? int a[3][4]={{1},{0,6},{9}};
? int b[3][4]={{1},{5,6}};
? int c[3][4]={{1},{},{0,0,11}};
?
?
?
?
?
?
?
?
?
?
1211109
8765
4321
?
?
?
?
?
?
?
?
?
?
0009
0060
0001
?
?
?
?
?
?
?
?
?
?
0000
0065
0001
?
?
?
?
?
?
?
?
?
?
01100
0000
0001
C语言程序设计 - 第 4章 数组 20
二维数组的初始化 (2)
? 对全部元素赋初值时,第一维长度可以省略,
其他维长度不能省略
? int a[][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
? 只对部分元素赋初值时,第一维长度也可以省
略,但是要用 {}分行,即能够判断第一维长度
? int a[][4]={{0,0,3},{},{0,10,11}};
?
?
?
?
?
?
?
?
?
?
1211109
8765
4321
?
?
?
?
?
?
?
?
?
?
011100
0000
0300
C语言程序设计 - 第 4章 数组 21
二维数组与一维数组
? 可以用一维数组描述二维数组
char a[2][3]; char a[6];
a[i][j] ? a[i*3+j]
...
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
...
...
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
...
C语言程序设计 - 第 4章 数组 22
二维数组程序举例
? 矩阵乘法
? ? ? ?
? ?
1,...,0;1,...,0,
,
1
0
?????
??
??
?
?
?
?
??
njmibac
cABC
bBaA
p
k
kjikij
nmij
npkjpmik
C语言程序设计 - 第 4章 数组 23
例 4:矩阵乘法 (04-04.C)
...,..
int a[M][P],b[P][N],c[M][N]={0};
...,..
for (i=0; i<M; i++)
for (j=0; j<N; j++)
for (k=0; k<P; k++)
c[i][j]+=a[i][k]*b[k][j];
...,..
C语言程序设计 - 第 4章 数组 24
字符数组
? 字符数组的使用
? 字符数组与字符串
? 字符数组的初始化
? 字符串结束标志
? 字符串的输入输出
? 字符串处理函数
? 字符串程序举例
C语言程序设计 - 第 4章 数组 25
字符数组的使用
? 与其他类型数组用法类似
?char a[10];
?a[5]='f'; a[7]='\n'; a[9]=105;
?a[0]=a[3]*4-a[4];
?char c[]={'a',',','*','\n'};
? 用作字符串变量
?字符串作为一维字符数组处理
?用字符数组名来引用字符串变量
?字符数组元素包括字符串结束标志 '\0'
C语言程序设计 - 第 4章 数组 26
字符数组与字符串
? 字符串作为一维字符数组来处理
? "China" ? char str[6]={'C','h',
'i','n','a','\0'};
...
str[0] 'C'
str[1] 'h'
str[2] 'i'
str[3] 'n'
str[4] 'a'
str[5] '\0'
...
...
'C'
'h'
'i'
'n'
'a'
'\0'
...
C语言程序设计 - 第 4章 数组 27
字符数组的初始化
? 字符数组初始化的方法
?逐个字符赋值给各元素
?用字符串常量赋初值
? 举例
?char s[]={'T','E','S','T','\0'};
?char s[]={"TEST"};
?char s[]="TEST";
?char s[][6]={"China","Anhui",
"Hefei","USTC"};
C语言程序设计 - 第 4章 数组 28
字符串结束标志
? 字符串结束标志 '\0'
?以 '\0'作为判断字符串结束的唯一标志
?与存放字符串的字符数组的长度无关
?所有字符串操作都以 '\0'作为结束条件
?如果对字符数组每个元素分别赋值,并作为
字符串使用,必须在最后手工添加 '\0'
?系统在字符串常量后自动添加 '\0'
? 举例
?char s[]={'U','S','T','C','\0'};
C语言程序设计 - 第 4章 数组 29
字符串的输入输出
? 整个字符串一次输入输出
?输出到第一个 '\0'结束,但不输出 '\0'
?输入输出时,用一维字符数组名表示字符串
?格式化输入时,不需要在数组名前加 '&'
?格式化输入时,空白字符表示输入结束
?系统自动添加 '\0',不需要手工输入
? 逐个字符输入输出
?用于一些特殊情况,如需要输入回车符
?getchar(); putchar();
C语言程序设计 - 第 4章 数组 30
字符串输入输出举例
char str[]="China";
printf("%s",str);
scanf("%s",str); /* 不用 &str */
char str[2][6];
scanf("%s%s",str[0],str[1]);
/* 一维字符数组 */
char str[]={'C','h','i','n','a'};
printf("%s",str); /* 得到什么结果? */
C语言程序设计 - 第 4章 数组 31
字符串处理函数
函数原型 说明
puts(str) 输出字符串,输出到 '\0'为止并换行
gets(str) 输入字符串,可输入空白字符,回车结束
strcat(s1,s2) 字符串连接,s1应留有总够的空间
strcpy(s1,s2) 字符串复制,s1应留有总够的空间
strcmp(s1,s2) 字符串比较,依次按 ASCII码比较
strlen(str) 字符串长度,不包括结束标志 '\0'
strlwr(str) 字符串小写,不是标准库函数
strupr(str) 字符串大写,不是标准库函数
C语言程序设计 - 第 4章 数组 32
字符串程序举例
? 实现字符串复制功能
strcpy(str1,str2);
? 实现字符串比较功能
strcmp(str1,str2);
C语言程序设计 - 第 4章 数组 33
例 5:字符串复制 (04-05.C)
...,..
char s[MAX],t[MAX];
int i;
...,..
for (i=0; s[i]!='\0'; i++)
t[i] = s[i];
t[i] = '\0';
for (i=0; t[i]=s[i]; i++);
C语言程序设计 - 第 4章 数组 34
例 6:字符串比较 (04-06.C)
...,..
char s[MAX],t[MAX];
int i;
...,..
for (i=0; s[i]==t[i]; i++)
if (s[i]=='\0')
return 0; /* 字符串相等 */
return s[i]-t[i]; /* 字符串不等 */
C语言程序设计 - 第 4章 数组 35
结束
The End
baixf@ustc.edu.cn
中国科学技术大学电子科学与技术系
Dept,of Elec,Sci,& Tech.,USTC
Fall,2003
第 4章 数 组
C语言程序设计 - 第 4章 数组 2
目 录
? 数组的概念
? 一维数组
? 二维数组
? 字符数组
C语言程序设计 - 第 4章 数组 3
数组 (Array)
? 概念
?有序数据的集合
? 说明
?数组中的每一个元素都属于同一数据类型
?用统一的数组名和下标来唯一的确定数组中
的元素
?数组元素的类型可以是基本类型或导出类型
C语言程序设计 - 第 4章 数组 4
一维数组
? 一维数组的定义
? 一维数组元素的引用
? 一维数组的存储形式
? 一维数组的初始化
? 一维数组程序举例
C语言程序设计 - 第 4章 数组 5
一维数组的定义
? 定义形式
?类型 数组名 [常量表达式 ];
? 说明
?常量表达式表示数组的大小 (元素个数 )
?数组大小只能是常量,不能包含变量
?整型数组与整型是两种不同的数据类型
? 举例
?int a[100],b[3*2];
C语言程序设计 - 第 4章 数组 6
一维数组元素的引用
? 引用形式
?数组名 [下标 ]
? 说明
?下标是整型表达式
?数组元素与同类型的变量使用方法相同
?数组下标范围为 0~N-1(N为数组长度 )
?注意防止数组下标越界
? 举例
?a[0]=a[5]+a[j]*3;
C语言程序设计 - 第 4章 数组 7
一维数组的存储形式
? 一维数组的元素在内存中依次连续存储
低地址,..
a[0]
a[1]
a[2]
a[3]
a[4]
高地址,..
char a[5];
C语言程序设计 - 第 4章 数组 8
一维数组的初始化
? 定义数组时对数组元素赋初值
?int a[5]={1,2,3,4,5};
? 只给部分元素赋初值
?int a[5]={1,2,3};
?int a[5]={0};
?其余元素初值为零
? 对全部元素赋初值时,可以不指定长度
?int a[]={1,2,3,4,5};
C语言程序设计 - 第 4章 数组 9
一维数组程序举例
? Fibonacci数列
? 冒泡排序法
? 筛法求素数
)3(
1
12
21
???
??
?? nFFF
FF
nnn
C语言程序设计 - 第 4章 数组 10
例 1,Fibonacci数列 (04-01.C)
#include <stdio.h>
void main()
{
int i,f[20]={1,1};
for (i=2; i<20; i++)
f[i] = f[i-2] + f[i-1];
}
C语言程序设计 - 第 4章 数组 11
例 2:冒泡排序法 (04-02.C)
? 两层循环结构
? 外层循环每次把操作
范围内最大的数放到
最后位置
? 内层循环每次把较大
的数放到靠后的位置
? 确定每层循环的边界
? 外层循环 n-1次
j=0 to n-2
? 内层循环 n-1-j次
i=0 to n-2-j
5
2
8
4
6
3
2
5
4
6
3
8
2
4
5
3
6
8
2
4
3
5
6
8
2
3
4
5
6
8
2
3
4
5
6
8
?
? ? ? ?
5
2
8
4
6
3
2
5
8
4
6
3
2
5
8
4
6
3
2
5
4
8
6
3
2
5
4
6
8
3
2
5
4
6
3
8
C语言程序设计 - 第 4章 数组 12
例 2:冒泡排序法 (续 ) 真 假
输 入 n 个 数 到 a [ 0 ] ~ a [ n - 1 ]
f o r j = 0 t o n - 2
输 出 a [ 0 ] ~ a [ n - 1 ]
f o r i = 0 t o n - j - 2
a [ i ] > a [ i + 1 ]
a [ i ] ? a [ i + 1 ]
C语言程序设计 - 第 4章 数组 13
例 3:筛法求素数 (04-03.C)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
C语言程序设计 - 第 4章 数组 14
例 3:筛法求素数 (续 )
#define MAX 100
...,..
for (i=2; i<MAX; i++)
s[i]=1; /* 初始化,所有数都在筛子中 */
for (i=2; i<MAX; i++)
if (s[i])
for (m=2*i; m<MAX; m+=i)
s[m]=0; /* 从筛子中筛去 */
...,..
C语言程序设计 - 第 4章 数组 15
二维数组
? 二维数组的定义
? 二维数组的存储形式
? 二维数组元素的引用
? 二维数组的初始化
? 二维数组与一维数组
? 二维数组程序举例
C语言程序设计 - 第 4章 数组 16
二维数组的定义
? 定义形式
?类型 数组名 [常量表达式 ][常量表达式 ];
?可以看作元素是一维数组的一维数组
? 举例
?char a[3][4]; /* 3行 4列 */
?
?
?
?
?
?
?
?
?
a[2][3]a[2][2],a[2][1],a[2][0],a[2]
a[1][3]a[1][2],a[1][1],a[1][0],a[1]
a[0][3]a[0][2],a[0][1],a[0][0],a[0]
a
C语言程序设计 - 第 4章 数组 17
二维数组的存储形式
? 按行存放,先行后列
char a[3][4];
低地址,..
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[2][1]
高地址
a[2][2]
a[2][3]
...
a [ 0 ] [ 0 ] a [ 0 ] [ 1 ] a [ 0 ] [ 2 ] a [ 0 ] [ 3 ]
a [ 1 ] [ 0 ] a [ 1 ] [ 1 ] a [ 1 ] [ 2 ] a [ 1 ] [ 3 ]
a [ 2 ] [ 0 ] a [ 2 ] [ 1 ] a [ 2 ] [ 2 ] a [ 2 ] [ 3 ]
C语言程序设计 - 第 4章 数组 18
二维数组元素的引用
? 表示形式
?数组名 [下标 ][下标 ]
? 说明
?用法与一维数组元素类似
?注意避免下标越界
?char a[3][4];
a[1][5] ? a[2][1]
低地址,..
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[2][0]
a[1][5] ? a[2][1]
高地址
a[2][2]
a[2][3]
...
C语言程序设计 - 第 4章 数组 19
二维数组的初始化 (1)
? 分行给二维数组赋初值
? int a[3][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
? 对部分元素赋初值
? int a[3][4]={{1},{0,6},{9}};
? int b[3][4]={{1},{5,6}};
? int c[3][4]={{1},{},{0,0,11}};
?
?
?
?
?
?
?
?
?
?
1211109
8765
4321
?
?
?
?
?
?
?
?
?
?
0009
0060
0001
?
?
?
?
?
?
?
?
?
?
0000
0065
0001
?
?
?
?
?
?
?
?
?
?
01100
0000
0001
C语言程序设计 - 第 4章 数组 20
二维数组的初始化 (2)
? 对全部元素赋初值时,第一维长度可以省略,
其他维长度不能省略
? int a[][4]={{1,2,3,4},
{5,6,7,8},
{9,10,11,12}};
? 只对部分元素赋初值时,第一维长度也可以省
略,但是要用 {}分行,即能够判断第一维长度
? int a[][4]={{0,0,3},{},{0,10,11}};
?
?
?
?
?
?
?
?
?
?
1211109
8765
4321
?
?
?
?
?
?
?
?
?
?
011100
0000
0300
C语言程序设计 - 第 4章 数组 21
二维数组与一维数组
? 可以用一维数组描述二维数组
char a[2][3]; char a[6];
a[i][j] ? a[i*3+j]
...
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
...
...
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
...
C语言程序设计 - 第 4章 数组 22
二维数组程序举例
? 矩阵乘法
? ? ? ?
? ?
1,...,0;1,...,0,
,
1
0
?????
??
??
?
?
?
?
??
njmibac
cABC
bBaA
p
k
kjikij
nmij
npkjpmik
C语言程序设计 - 第 4章 数组 23
例 4:矩阵乘法 (04-04.C)
...,..
int a[M][P],b[P][N],c[M][N]={0};
...,..
for (i=0; i<M; i++)
for (j=0; j<N; j++)
for (k=0; k<P; k++)
c[i][j]+=a[i][k]*b[k][j];
...,..
C语言程序设计 - 第 4章 数组 24
字符数组
? 字符数组的使用
? 字符数组与字符串
? 字符数组的初始化
? 字符串结束标志
? 字符串的输入输出
? 字符串处理函数
? 字符串程序举例
C语言程序设计 - 第 4章 数组 25
字符数组的使用
? 与其他类型数组用法类似
?char a[10];
?a[5]='f'; a[7]='\n'; a[9]=105;
?a[0]=a[3]*4-a[4];
?char c[]={'a',',','*','\n'};
? 用作字符串变量
?字符串作为一维字符数组处理
?用字符数组名来引用字符串变量
?字符数组元素包括字符串结束标志 '\0'
C语言程序设计 - 第 4章 数组 26
字符数组与字符串
? 字符串作为一维字符数组来处理
? "China" ? char str[6]={'C','h',
'i','n','a','\0'};
...
str[0] 'C'
str[1] 'h'
str[2] 'i'
str[3] 'n'
str[4] 'a'
str[5] '\0'
...
...
'C'
'h'
'i'
'n'
'a'
'\0'
...
C语言程序设计 - 第 4章 数组 27
字符数组的初始化
? 字符数组初始化的方法
?逐个字符赋值给各元素
?用字符串常量赋初值
? 举例
?char s[]={'T','E','S','T','\0'};
?char s[]={"TEST"};
?char s[]="TEST";
?char s[][6]={"China","Anhui",
"Hefei","USTC"};
C语言程序设计 - 第 4章 数组 28
字符串结束标志
? 字符串结束标志 '\0'
?以 '\0'作为判断字符串结束的唯一标志
?与存放字符串的字符数组的长度无关
?所有字符串操作都以 '\0'作为结束条件
?如果对字符数组每个元素分别赋值,并作为
字符串使用,必须在最后手工添加 '\0'
?系统在字符串常量后自动添加 '\0'
? 举例
?char s[]={'U','S','T','C','\0'};
C语言程序设计 - 第 4章 数组 29
字符串的输入输出
? 整个字符串一次输入输出
?输出到第一个 '\0'结束,但不输出 '\0'
?输入输出时,用一维字符数组名表示字符串
?格式化输入时,不需要在数组名前加 '&'
?格式化输入时,空白字符表示输入结束
?系统自动添加 '\0',不需要手工输入
? 逐个字符输入输出
?用于一些特殊情况,如需要输入回车符
?getchar(); putchar();
C语言程序设计 - 第 4章 数组 30
字符串输入输出举例
char str[]="China";
printf("%s",str);
scanf("%s",str); /* 不用 &str */
char str[2][6];
scanf("%s%s",str[0],str[1]);
/* 一维字符数组 */
char str[]={'C','h','i','n','a'};
printf("%s",str); /* 得到什么结果? */
C语言程序设计 - 第 4章 数组 31
字符串处理函数
函数原型 说明
puts(str) 输出字符串,输出到 '\0'为止并换行
gets(str) 输入字符串,可输入空白字符,回车结束
strcat(s1,s2) 字符串连接,s1应留有总够的空间
strcpy(s1,s2) 字符串复制,s1应留有总够的空间
strcmp(s1,s2) 字符串比较,依次按 ASCII码比较
strlen(str) 字符串长度,不包括结束标志 '\0'
strlwr(str) 字符串小写,不是标准库函数
strupr(str) 字符串大写,不是标准库函数
C语言程序设计 - 第 4章 数组 32
字符串程序举例
? 实现字符串复制功能
strcpy(str1,str2);
? 实现字符串比较功能
strcmp(str1,str2);
C语言程序设计 - 第 4章 数组 33
例 5:字符串复制 (04-05.C)
...,..
char s[MAX],t[MAX];
int i;
...,..
for (i=0; s[i]!='\0'; i++)
t[i] = s[i];
t[i] = '\0';
for (i=0; t[i]=s[i]; i++);
C语言程序设计 - 第 4章 数组 34
例 6:字符串比较 (04-06.C)
...,..
char s[MAX],t[MAX];
int i;
...,..
for (i=0; s[i]==t[i]; i++)
if (s[i]=='\0')
return 0; /* 字符串相等 */
return s[i]-t[i]; /* 字符串不等 */
C语言程序设计 - 第 4章 数组 35
结束
The End