目录
(一)数组的基本概念、一维数组和二维数组的定义、引用与初始化
(二)字符数组的定义、引用与初始化,字符数组的输入与输出,字符串和字符串处理函数的应用
(一)数组的基本概念、一维数组和二维数组的定义、引用与初始化
①数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
C语言用方括号中的数字表示下标,如用s[15]表示。
②用一个数组名和下标惟一确定数组中的元素。
③数组中的每一个元素都属于同一个数据类型。
一、怎样定义和引用一维数组
1、怎样定义一维数组
一维数组是数组中最简单的。
它的元素只需要用数组名加一个下标,就能惟一确定。
要使用数组,必须在程序中先定义数组。
定义一维数组的一般形式为:
类型符 数组名[常量表达式];
数组名的命名规则和变量名相同
如 int a[10]; //其中a为数组名,10为数组长度,int表示每个元素的数据类型
例如:
int a[4+6]; 合法
int n=10; 不合法
int a[n]; 不合法
2、怎样引用一维数组元素
在定义数组并对其中各元素赋值后,就可以引用数组中的元素。
注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。
引用数组元素的表示形式为:
数组名[下标]
例如:
a[0]=a[5]+a[7]-a[2*3] 合法
int n=5,a[10]; 合法
a[n]=20; 合法
3、一维数组的初始化
在定义数组的同时,给各数组元素赋值
int a[10]={0,1,2,3,4,5,6,7,8,9}; //对全部元素赋值
int a[10]={0,1,2,3,4};相当于int a[10]={0,1,2,3,4,0,0,0,0,0}; //只给一部分赋值
int a[10]={0,0,0,0,0,0,0,0,0,0}; 相当于int a[10]={0}; //令全部值为0
int a[5]={1,2,3,4,5}; 可写为int a[ ]={1,2,3,4,5}; //可以不指定长度
4、一维数组程序举例
用数组处理求Fibonacci数列问题,
#include <stdio.h>
int main()
{
int i; int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{
if(i%5==0) printf("\n");
printf("%12d",f[i]);
}
printf("\n");
return 0;
}
二、怎样定义和引用二维数组
1、怎样定义二维数组
二维数组定义的一般形式为:
类型符 数组名[常量表达式][常量表达式];
如:float a[3][4],b[5][10];
二维数组可被看作是一种特殊的一维数组:
它的元素又是一个一维数组。
例如,把a看作是一个一维数组,它有3个元素:
a[0]、a[1]、a[2]
每个元素又是一个包含4个元素的一维数组。
2、怎样引用二维数组的元素
二维数组元素的表示形式为: 数组名[下标][下标]
b[1][2]=a[2][3]/2 合法
for(i=0;i<m;i++)
printf(“%d,%d\n”,a[i][0],a[0][i]); 合法
3、二维数组的初始化
例如int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //分行给二维数组赋初值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //按数组元素在内存中的排列顺序赋值
int a[3][4]={{1},{5},{9}}; 等价于 int a[3][4]={{1,0,0,0},{5,0,0,0}, {9,0,0,0}}; //可以对部分赋值
int a[3][4]={{1},{5,6}}; 相当于 int a[3][4]={{1},{5,6},{0}}; //只对某几行赋值
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于: int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12}; //一维长度可不指定,二维长度不能省
int a[ ][4]={{0,0,3},{ },{0,10}};合法
4、二维数组程序举例
将一个二维数组行和列的元素互换,存到另一个二维数组中。
例如:
a=[1 2 3] 将其转化为b=[1 4]
[4 5 6] [2 5]
[3 6]
#include <stdio.h>
int main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\n");
for (i=0;i<=1;i++) //处理a的一行中各元素
{
for (j=0;j<=2;j++) //处理a中某一列元素
{
printf("%5d",a[i][j]); //输出a的各元素
b[j][i]=a[i][j]; //a元素值赋给b相应元素
}
printf("\n");
}
printf("array b:\n");
for (i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf("%5d",b[i][j]); //输出b的各元素
printf("\n");
}
return 0;
}
(二)字符数组的定义、引用与初始化,字符数组的输入与输出,字符串和字符串处理函数的应用
1、怎样定义字符数组。
用来存放字符数据的数组是字符数组。
字符数组中的一个元素存放一个字符。
定义字符数组的方法与定义数值型数组的方法类似。
char c[10];
c[0]=’I’; c[1]=’ ’;
c[2]=’a’; c[3]=’m’;
c[4]=’ ’; c[5]=’h’;
c[6]=’a’; c[7]=’p’;
c[8]=’p’; c[9]=’y’;
c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]
i a m h a p p y
2、字符数组的初始化。
char c[10]={’I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’};
c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]
I
a
m
h
a
p
p
y
char c[10]={’c’,’ ’,’p’,’r’,’o’,’g’,’r’,’a’,’m’};
c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]
c
p
r
o
g
r
a
m
\0
char diamond[5][5]={{’ ’,’ ’,’*’},
{’ ’,’*’,’ ’,’*’},
{’*’,’ ’,’ ’,’ ’,’*’},
{’ ’,’*’,’ ’,’*’},
{’ ’,’ ’,’*’} };
3、怎样引用字符数组中的元素。
例如一:输出一个已知的字符串。
#include <stdio.h>
int main() {
char c[15]={'I',' ','a','m',' ','a', ' ','s','t','u','d','e','n','t','.'};
int i;
for(i=0;i<15;i++)
printf("%c",c[i]);
printf("\n");
return 0;
}
例如二:输出一个菱形图。
#include <stdio.h>
int main() {
char diamond[][5]={{' ',' ','*'}, {' ','*',' ','*'},{'*',' ',' ',' ','*'}, {' ','*',' ','*'},{' ',' ','*'}};
int i,j;
for (i=0;i<5;i++)
{for (j=0;j<5;j++)
printf("%c",diamond[i][j]);
printf("\n");
}
return 0;
}
4、字符串和字符串结束标志。
在C语言中,是将字符串作为字符数组来处理的。
关心的是字符串的有效长度而不是字符数组的长度。
为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’。
’\0’代表ASCII码为0的字符,从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。
用它作为字符串结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志。
例如:
char c[ ]={”I am happy”};
可写成
char c[ ]=”I am happy”;
相当于
char c[11]={”I am happy”};
char c[10]={”China”};
可写成
char c[10]=”China”;
从c[5]开始,元素值均为\0。
例如:
C
h
i
n
a
\0
\0
\0
\0
\0
只显示 printf(”%s”,c);
5、字符数组的输入输出。
字符数组的输入输出可以有两种方法:
①逐个字符输入输出(%c)。
②整个字符串一次输入输出(%s)。
输出的字符中不包括结束符’\0’ 。
用%s输出字符串时,printf函数中的输出项是字符数组名,不是数组元素名。
如果一个字符数组中包含多个’\0’,则遇第一个’\0’时输出就结束。
可以用scanf函数输入一个字符串。
scanf函数中的输入项c是已定义的字符数组名,输入的字符串应短于已定义的字符数组的长度。
例如:
char c[6];
scanf(”%s”,c); China↙
系统自动在China后面加一个’\0’。
char str1[5],str2[5],str3[5];
scanf(”%s%s%s”,str1,str2,str3);
How are you? ↙
str1: H o w \0 \0
str2: a r e \0 \0
str3: y o u \0 \0
6、善于使用字符串处理函数 。
在C函数库中提供了一些用来专门处理字符串的函数,使用方便.
(1)puts函数----输出字符串的函数。
其一般形式为:
puts (字符数组)
作用是将一个字符串输出到终端.
char str[20]=”China”;
puts(str);
输出China
(2)gets函数----输入字符串的函数。
其一般形式为:
gets(字符数组)
作用是输入一个字符串到字符数组.
char str[20];
gets(str);
Computer↙
(3)strcat函数----字符串连接函数。
其一般形式为:
strcat(字符数组1,字符数组2)
其作用是把两个字符串连接起来,把字符串2接到字符串1的后面,结果放在字符数组1中。
注:使用字符串函数时,在程序开头用#include <string.h>。
char str1[30]=”People”; //其中此处的值30要足够大。
char str2[ ]=”China”;
printf(”%s”, strcat(str1,str2));
输出:PeopleChina
(4)strcpy和strncpy函数-字符串复制。
strcpy一般形式为:
strcpy(字符数组1,字符串2)
作用是将字符串2复制到字符数组1中去。
char str1[10],str2[ ]=”China”; //此处的数值10也要足够大
strcpy(str1,str2); //此处的str1是数组名的形式,str2是数组名或字符串常量
str1: c h i n a \0 \0 \0 \0 \0
其中strcpy(str1,str2); 相当于 strcpy(str1,”China”);
例如:
char str1[10],str2[]=”China”;
str1=”China”; 错误
str1=str2; 错误
可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去。
strncpy(str1,str2,2);
作用是将str2中最前面2个字符复制到str1中,取代str1中原有的最前面2个字符。
复制的字符个数n不应多于str1中原有的字符。
(5) strcmp函数----字符串比较函数。
其一般形式为:
strcmp(字符串1,字符串2)
作用是比较字符串1和字符串2
strcmp(str1,str2);
strcmp(”China”,”Korea”);
strcmp(str1,”Beijing”);
字符串比较的规则是:
①将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到’\0’为止。
②如全部字符相同,认为两个字符串相等。
③若出现不相同的字符,则以第一对不相同的字符的比较结果为准
例如:
”A”<”B”
”a”>”A”
”computer”>”compare”
”these”>”that”
”1A”>”$20”
”CHINA”>”CANADA”
”DOG”<”cat”
”Tsinghua”>”TSINGHUA”
比较的结果由函数值带回:
①如果字符串1=字符串2,则函数值为0。
②如果字符串1>字符串2,则函数值为一个正整数。
③如果字符串1<字符串2,则函数值为一个负整数。
例如:
if(str1>str2) printf(”yes”); 错误
if(strcmp(str1,str2)>0) printf(”yes”); 正确
(6)strlen函数----测字符串长度的函数
其一般形式为:
strlen (字符数组)
它是测试字符串长度的函数。
函数的值为字符串中的实际长度。
例如:
char str[10]=”China”;
printf(”%d”,strlen(str)); 输出结果是5
也可以直接测试字符串常量的长度:
strlen(”China”);
(7)strlwr函数----转换为小写的函数。
其一般形式为
strlwr (字符串)
函数的作用是将字符串中大写字母换成小写字母。
(8) strupr函数----转换为大写的函数。
其一般形式为
strupr (字符串)
函数的作用是将字符串中小写字母换成大写字母。
7、字符数组应用举例
例一:
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
#include<stdio.h>
int main(){
char string[81],c;
int i,num=0,word=0;
printf("请输入一串字符:");
gets(string);
for(i=0;(c=string[i])!='\0';i++)
if(c==' ')
word=0;
else if(word==0)
{
word=1;
num++;
}
printf("%d words\n",num);
}
例二:
有3个字符串,要求找出其中最大者。
#include<stdio.h>
#include<string.h>
int main(){
char str[3][10];
char string[10];
int i;
for (i=0;i<3;i++)
printf("请输入三个字符串:");
gets (str[i]);
if (strcmp(str[0],str[1])>0)
strcpy(string,str[0]);
else
strcpy(string,str[1]);
if(strcmp(str[2],string)>0)
strcpy(string,str[2]);
printf("\nthe largest:\n%s\n",string);
return 0;
}