第四章 数组
4.1 概述
4.2 一维数组
4.3 二维数组
4.4 字符数组
4.1 概述数组是有序数据的集合。数组中的每一个元素都属于 同一个数据类型 。用一个 统一的数组名 和 下标 来唯一地确定数组中的元素。
什么是数组呢?
当要对一组数据进行排序,在一组数中查找某个数据,
矩阵计算等,通常都要用数组来实现 。
2.在内存分配 若干连续空间 给数组,
4.2 一维数组
1.定义:类型说明符 数组名 [常量表达式 ];
4.2.1一维数组的定义和初始化合法标识符 表示元素个数下标从 0 开始
[ ] 数组运算符单目运算符优先级 (1)
左结合不能用 ( )
例 int a[6];
编译时分配连续内存内存字节数 =数组长度 *
sizeof(元素数据类型 )数组名表示内存首地址,是 地址常量
a[0]0
1
4
5
a[1]
a[2]
a[3]
a[4]
a[5]
2
3
a
内存例 int i = 15;
int data[i]; (?不能用变量定义数组长度 )
例 int data[5];
data[5] = 10; //? C语言对数组不作越界检查,使用时要 注意
3,一维数组的初始化
初始化方式在定义数组时,为数组元素赋初值
(在编译阶段使之得到初值)
int a[5]={1,2,3,4,5};
等价于,a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
说明:
数组不初始化,其元素值为随机数
在对全部数组元素赋初值时,可不指定数组长度如 int a[5] = {6,2,3};// 未指定的用 0 填充等价于,a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;
如 int a[3] = {6,2,3,5,1}; (?)
只给部分数组元素赋初值
int a[ ] = {1,2,3,4,5,6};
编译系统根据初值 个数 确定数组 长度
如果想使一个数组中全部元素值为 0,可以写成:
int a[5] = {0,0,0,0,0}; 或 int a[5] = {0};
1.数组同变量一样,必须先定义后引用
2.引用数组元素的方法是,数组名 [下标 ]
4.2.2 一维数组元素的引用例如,有定义 int a[10]; 可以引用元素的从 a[0]到 a[9]
a[3+5] a[10-10] a[5]=6; a[7]=a[5]++;
整型常量整型常量表达式
int a[10];
必须 for(j = 0;j < 10;j++)
printf(“%d \t”,a[j]); (?)
printf(“%d”,a); (?)
循环变量 j 的作用:
1、控制循环 次数
2、用作数组 下标
3.只能逐个引用数组元素,不能一次引用整个数组例 4-1 把数组 a的元素依次赋 0,10,20,…,90,再把 a的元素值按逆序输出
#include <stdio.h>
void main()
{int i,a[10];
printf("input 10 numbers:\n");
for(i=0; i<10; i++)
a[i]=i*10;
for(i=9; i>=0; i--)
printf("%d ",a[i]);
}
程序运行结果:
90 80 70 60 50 40 30 20 10 0
数组类题目定义数组输入 /赋值运算输出基本方法例 4-2 利用数组,求斐波拉契数列的前 20项 。
定义数组计算输出
#include "stdio.h“
void main()
{ int fib[20]={1,1}
int i;
for(i=2; i<20; i++)
fib[i]=fib[i-1]+fib[i-2];
for(i=0; i<20; i++)
{ if(i%4==0)
printf(“\n”);
printf("%12d ",fib[i]);
}
}
4.3 二 维数组
1.定义方式,
类型说明符 数组名 [表达式 1][表达式 2];
行数 列数例,float a[3][4],b[5][10];
4.3.1 二维数组的定义和初始化
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
2.说明:
二维数组可看作特殊的一维数组;
元素在内存排列顺序为 按行存放 ;
多维数组定义亦类似于二维数组,如,float
a[2][3][4];
例,int a[2][3];
它在内存情况,
3,二维数组的初始化
(2)分行初始化。
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(1)按数组排列的顺序将所有数据写在一个花括号内。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)部分元素初始化。如:
int a[3][4]={{,1},{0,6},{0,0,11}};
0 1 0 0
0 6 0 0
0 0 11 0
(4)如果对全部元素都赋初值,则定义数组时可以不指定 第一维 的长度,
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
若对部分元素赋初值而省略第一维的长度,必须用分行赋值来实现。
int a[][5]={{1,0,3},{0,15}}
数组名 [行下标 ] [列下标 ];
例,int a[3][5];
则可以有如下引用,a[1+1][2*2-1]等注意,下标值应该在已定义的数组大小范围内。
4.3.2 二维数组元素的引用例 4-4 编程将下列矩阵中的元素向右移动一列,最右列移至第一列。
2 5 6
9 7 8
#include <stdio.h>
void main()
{ int a[2][3]={{2,5,6},{9,7,8}};
int i,j,temp;
for(i=0; i<2; i++)
{ temp=a[i][3-i];
for(j=3-i; j>=0; j--)
a[i][j+1]=a[i][j];
a[i][0]=temp;
}
for(i=0; i<2; i++)
{ for(j=0; j<3; j++)
printf(“%6d,,a[i][j]);
printf(“\n”);
}
}
例 4-5 输出杨辉三角的前 6行数据。
#include <stdio.h>
void main()
{ int i,j,a[6][6];
for(i=0; i<6; i++)
{ a[i][0]=1; a[i][i]=1;}
for(i=2; i<6; i++)
for(j=1; j<=i-1; j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0; i<6; i++)
{ for(j=0; j<=i; j++)
printf(“%4d,,a[i][j]);
printf(“\n”);
}
}
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
4.4 字符 数组字符串,由若干有效字符构成且以字符‘ \0?作为结束符号的一个字符序列字符串常量,用一对双引号括起来的一串字符。
定义方法与数值型数组类似:
char 数组名 [常量表达式 ]; 如,char a[5];
元素为,a[0],a[1],…….,a[4],每一个元素的值为 一个字符 。
4.4.1 字符串与一维字符数组
1,字符数组的存储结构同数值型数组一样,系统在内存为字符数组分配若干(和数组元素个数相同) 连续的 存储单元,每个存储单元为一个字节。
例如,char a[5];
假设 a[0]='A'; a[1]=' '; a[2]='B';
a[3]='o'; a[4]='y';
则数组 a在内存存储示意图如下图
A B o y
a[0] a[1] a[2] a[4]a[3]
(1) 逐个元素初始化,如:
char c[10]={?h?,?a?,?p?,?p?,?y?};
说明:
如果初值个数 >数组长度,则作 语法错误 处理;
如果初值个数 <数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为 空字符 (?\0?);
如果初值个数 =数组长度,则在定义时可省略数组长度。
2.字符数组的初始化
(2) 用字符串来初始化字符数组例如,char a[11] = {”I am a boy”};
I a m a b o y \0
char ch[6] = {“Hello”};
char ch[6] =,Hello”;
char ch[ ] =,Hello”;
4.4.2 二维字符数组一维字符数组存放一个字符串,二维字符数组可存放多个字符串。
char weekday[7][10]=
{,sunday”,”monday”,”tuesday”,”wendnesday”,”th
ursday”,”friday”,”saturday”};
第二维长度不能省略,应按最长的字符串长度设定例 4-7 输出如下图所示的钻石图形
*
* *
* *
* *
*
*
* *
* *
* *
*
#include <stdio.h>
void 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”); }
}
假设有定义 char a[10];
1.用格式符? %c”逐个字符 输入输出,
4.4.3 字符串的输入与输出
scanf(“%c”,&a[0]);
printf(“%c”,a[0]); /*每次输入输出一个字符 */
2,用格式符? %s”整个字符串输入输出,
例 用 %s
main()
{ char str[5];
scanf(“%s”,str);
printf(“%s”,str);
}
用字符数组名,不要加 &
输入串长度 < 数组长度遇空格或回车结束自动加 ‘ \0?
用字符数组名,
遇‘ \0?结束例 main( )
{ char a[5]={?H?,?e?,?l?,?l?,?o?};
printf(“%s”,a);
}
例 main( )
{ char a[ ] =,Hello”;
printf(“%s”,a);
}
结果,Hello#-=*……
(直到偶然遇到 ‘ \0?)
h e l l o
0 2 31 4
结果,Hello
用? %s”输出时,
遇 ‘ \0?结束
,”双引号定义的字符串
,末尾自动添加结尾符
‘ \0?
main()
{
char a[] = {'h','e','l','\0','l','o','\0'};
printf("%s",a);
}
输出,hel
h e l \0 l o \0
数组中有多个 ‘ \0?时,
遇第一个结束例如:
char s1[5],s2[5];
scanf("%s%s",s1,s2);
C \0
P r o g \0
则字符数组 s1和 s2
的存储情况如右图所示若输入数据:
C Prog↙
用? %s”输入时,遇空格或回车键结束
1.用字符串输入函数 gets实现输入,
字符串输入输出函数的函数原型在头文件? stdio.h”中被说明,调用该函数时,应在程序中加入文件包含命令:
#include"stdio.h"
函数功能,从键盘输入一以回车结束的字符串放入字符数组中,并自动加 ‘ \0’
调用形式,gets(字符数组) ;
举例,char a[10];
gets(a);
printf(" %s",a);
4.4.4 字符串处理函数
2.用字符串输出函数 puts实现输出
函数功能,向显示器输出字符串 ( 输出完,换行 )
调用形式,puts(字符串 /字符数组 ) ;
应用举例,char a[10];
gets(a);
puts(a);
【 例 】 将字符串 s1从第 m个字符开始剩余的所有字符,送入字符数组 s2中。
#include "stdio.h"
void main()
{int i,j,m;
char s1[80],s2[80];
printf("input a string:\n");
gets(s1);
printf("input start point:\n");
scanf("%d",&m);
i=m-1; j=0;
while(s1[i]!='\0')
{s2[j]=s1[i]; i++; j++; }
s2[j]='\0';
puts(s2);
}
以下函数在使用时应在程序头文件处添加声明
#include,string.h”
3.计算字符串长度的函数 strlen(字符数组 )
函数功能,求出字符串或字符数组中实际字符个数
(不包括 '\0')。
#include "stdio.h"
#include "string.h"
void main()
{ static char st[20]={"hello\0abce\0abc\0"};
printf("%d\n",strlen(st));
}
4,strupr(字符数组 )
函数功能,将字符串中的小写字母转换为大写字母。
5,strlwr(字符数组 )
函数功能,将字符串中的大写字母转换为小写字母。
6,字符串比较函数 strcmp(字符串 1,字符串 2)
函数功能,
从左到右逐个比较两个字符串 s1,s2
中各个字符(用字符的 ASCII码比较),
直到出现不同字符或遇到结束标记为止。
例如,strcmp(" d "," abc ") 结果为正整数。
strcmp(" dog "," door ") 结果为负整数。
函数返回值:
函数值 =
0 当串 1=串 2
负整数 当串 1<串 2
正整数 当串 1>串 2
函数应用举例,
说明,字符串比较不能用? = =?,必须用 strcmp
7.字符串连接函数 strcat(字符数组 1,字符数组 2)
函数功能,
删去字符串字符数组 1的结束标志 '\0',将字符串或字符数组 2连同末尾的结束标记一起连接到字符数组 1尾部,返回连接以后的字符串 。
应用举例
char a[20]="My name is ",b[10]="Li ming";
strcat(a,b);
执行 strcat(a,b) 后 a数组如下:
M y n a m e i s L i m i n g \0
函数功能,用是将字符数组 2复制到字符数组 1中去。
返回被复制的字符串。
函数说明:
字符数组 1长度应 ≥字符串或字符数组 2的长度;
字符数组 1应写成数组名的形式;
复制时连同通字符串后面的‘ \0?一起复制过去。
8,字符串拷贝函数 strcpy(字符数组 1,字符数组 2)
例 char str1[20],str2[20];
str1 = {“Hello!”}; (× )
str2 = str1; (× )
strcpy( str2,str1 ); (√)
不能使用赋值语句为一个字符数组赋值例如,char a[10]="abcdefghi",b[]="happy";
strcpy(a,b);
函数应用举例:
a数组内存原始情况,a b c d e f g h i \0
函数调用后 a,b数组内存情况,h a p p y \0
h a p p y \0 g h i \0
【 例 】 分析下面程序的运行结果。
#include "conio.h"
#include "string.h"
#include "stdio.h"
void main()
{ char c1[10]="abcdefghi",c2[]="china";
strcpy(c1,c2);
puts(c1);
printf("%c",c1[7]);
}
9,strcpy(字符数组 1,字符数组 2,n)
函数功能,用是将字符数组 2中前 n个字符赋值到字符数组 1中去。
应用举例,
char str1[6]=“the”,str2[5]=“sell”;
printf(“%s”,strncpy(str1,str2,2) );
结果是,see
例 4-10 输入一行字符,统计其中英文字符、数字字符、空格及其他字符的个数。
#include <stdio.h>
#include <string.h>
#define Size 100
main()
{ char str[Size];
int len,i,letter=0,digit=0,space=0,other=0;
printf(“pleaseinput a string\n");
gets(str);
len=strlen(str);
for( i=0;i<len;i++)
{ if((str[i] >=?a?&& str[i] <=?z?) ||
(str[i] >=?A?&& str[i] <=?Z?)) letter++;
else if(str[i] >=?0?&& str[i] <=?9?) digit++;
else if(str[i] ==) space++;
else other++;
}
printf(”%d letters;\n%d digit \n %d space\n %d other\n ",
letter,digit,space,other);
例 4-11 从键盘上输入 5门课程的名字,按字典顺序输出最前面的课程名字,
#include <stdio.h>
#include <string.h>
void main()
{ int i; char str[30],min[30];
printf(“please enter five courses names:\n”);
gets(str);
strcpy(min,str);
for(i=1;i<5; i++)
{gets(str);
if (strcmp(str,min)<0) strcpy(min,str);
}
printf(“the min is:”);
puts(min);
}
例 4-12 任意 输入一行字符,统计其中有多少个单词。
输入一字符串给 str
i=0 num=0 word=0
当 ((c=str[i])!=?\0?)
c=空格真真假假
word=0 num=num+1
word=1
i=i+1
输出,num
word==0
#include <stdio.h>
main()
{ char string[100];
int i,num=0,word=0;
char c;
gets(str);
for(i = 0; (c=str [i])!=?\0? ; i++)
if( c = = ' ' )
word = 0;
else if(word = = 0)
{num++;
word = 1;}
printf("There are %d words \
in the line\n",num);
}
4.1 概述
4.2 一维数组
4.3 二维数组
4.4 字符数组
4.1 概述数组是有序数据的集合。数组中的每一个元素都属于 同一个数据类型 。用一个 统一的数组名 和 下标 来唯一地确定数组中的元素。
什么是数组呢?
当要对一组数据进行排序,在一组数中查找某个数据,
矩阵计算等,通常都要用数组来实现 。
2.在内存分配 若干连续空间 给数组,
4.2 一维数组
1.定义:类型说明符 数组名 [常量表达式 ];
4.2.1一维数组的定义和初始化合法标识符 表示元素个数下标从 0 开始
[ ] 数组运算符单目运算符优先级 (1)
左结合不能用 ( )
例 int a[6];
编译时分配连续内存内存字节数 =数组长度 *
sizeof(元素数据类型 )数组名表示内存首地址,是 地址常量
a[0]0
1
4
5
a[1]
a[2]
a[3]
a[4]
a[5]
2
3
a
内存例 int i = 15;
int data[i]; (?不能用变量定义数组长度 )
例 int data[5];
data[5] = 10; //? C语言对数组不作越界检查,使用时要 注意
3,一维数组的初始化
初始化方式在定义数组时,为数组元素赋初值
(在编译阶段使之得到初值)
int a[5]={1,2,3,4,5};
等价于,a[0]=1; a[1]=2; a[2]=3; a[3]=4; a[4]=5;
说明:
数组不初始化,其元素值为随机数
在对全部数组元素赋初值时,可不指定数组长度如 int a[5] = {6,2,3};// 未指定的用 0 填充等价于,a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0;
如 int a[3] = {6,2,3,5,1}; (?)
只给部分数组元素赋初值
int a[ ] = {1,2,3,4,5,6};
编译系统根据初值 个数 确定数组 长度
如果想使一个数组中全部元素值为 0,可以写成:
int a[5] = {0,0,0,0,0}; 或 int a[5] = {0};
1.数组同变量一样,必须先定义后引用
2.引用数组元素的方法是,数组名 [下标 ]
4.2.2 一维数组元素的引用例如,有定义 int a[10]; 可以引用元素的从 a[0]到 a[9]
a[3+5] a[10-10] a[5]=6; a[7]=a[5]++;
整型常量整型常量表达式
int a[10];
必须 for(j = 0;j < 10;j++)
printf(“%d \t”,a[j]); (?)
printf(“%d”,a); (?)
循环变量 j 的作用:
1、控制循环 次数
2、用作数组 下标
3.只能逐个引用数组元素,不能一次引用整个数组例 4-1 把数组 a的元素依次赋 0,10,20,…,90,再把 a的元素值按逆序输出
#include <stdio.h>
void main()
{int i,a[10];
printf("input 10 numbers:\n");
for(i=0; i<10; i++)
a[i]=i*10;
for(i=9; i>=0; i--)
printf("%d ",a[i]);
}
程序运行结果:
90 80 70 60 50 40 30 20 10 0
数组类题目定义数组输入 /赋值运算输出基本方法例 4-2 利用数组,求斐波拉契数列的前 20项 。
定义数组计算输出
#include "stdio.h“
void main()
{ int fib[20]={1,1}
int i;
for(i=2; i<20; i++)
fib[i]=fib[i-1]+fib[i-2];
for(i=0; i<20; i++)
{ if(i%4==0)
printf(“\n”);
printf("%12d ",fib[i]);
}
}
4.3 二 维数组
1.定义方式,
类型说明符 数组名 [表达式 1][表达式 2];
行数 列数例,float a[3][4],b[5][10];
4.3.1 二维数组的定义和初始化
a[0][0]
a[0][1]
a[0][2]
a[1][0]
a[1][1]
a[1][2]
2.说明:
二维数组可看作特殊的一维数组;
元素在内存排列顺序为 按行存放 ;
多维数组定义亦类似于二维数组,如,float
a[2][3][4];
例,int a[2][3];
它在内存情况,
3,二维数组的初始化
(2)分行初始化。
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(1)按数组排列的顺序将所有数据写在一个花括号内。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)部分元素初始化。如:
int a[3][4]={{,1},{0,6},{0,0,11}};
0 1 0 0
0 6 0 0
0 0 11 0
(4)如果对全部元素都赋初值,则定义数组时可以不指定 第一维 的长度,
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
若对部分元素赋初值而省略第一维的长度,必须用分行赋值来实现。
int a[][5]={{1,0,3},{0,15}}
数组名 [行下标 ] [列下标 ];
例,int a[3][5];
则可以有如下引用,a[1+1][2*2-1]等注意,下标值应该在已定义的数组大小范围内。
4.3.2 二维数组元素的引用例 4-4 编程将下列矩阵中的元素向右移动一列,最右列移至第一列。
2 5 6
9 7 8
#include <stdio.h>
void main()
{ int a[2][3]={{2,5,6},{9,7,8}};
int i,j,temp;
for(i=0; i<2; i++)
{ temp=a[i][3-i];
for(j=3-i; j>=0; j--)
a[i][j+1]=a[i][j];
a[i][0]=temp;
}
for(i=0; i<2; i++)
{ for(j=0; j<3; j++)
printf(“%6d,,a[i][j]);
printf(“\n”);
}
}
例 4-5 输出杨辉三角的前 6行数据。
#include <stdio.h>
void main()
{ int i,j,a[6][6];
for(i=0; i<6; i++)
{ a[i][0]=1; a[i][i]=1;}
for(i=2; i<6; i++)
for(j=1; j<=i-1; j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0; i<6; i++)
{ for(j=0; j<=i; j++)
printf(“%4d,,a[i][j]);
printf(“\n”);
}
}
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
4.4 字符 数组字符串,由若干有效字符构成且以字符‘ \0?作为结束符号的一个字符序列字符串常量,用一对双引号括起来的一串字符。
定义方法与数值型数组类似:
char 数组名 [常量表达式 ]; 如,char a[5];
元素为,a[0],a[1],…….,a[4],每一个元素的值为 一个字符 。
4.4.1 字符串与一维字符数组
1,字符数组的存储结构同数值型数组一样,系统在内存为字符数组分配若干(和数组元素个数相同) 连续的 存储单元,每个存储单元为一个字节。
例如,char a[5];
假设 a[0]='A'; a[1]=' '; a[2]='B';
a[3]='o'; a[4]='y';
则数组 a在内存存储示意图如下图
A B o y
a[0] a[1] a[2] a[4]a[3]
(1) 逐个元素初始化,如:
char c[10]={?h?,?a?,?p?,?p?,?y?};
说明:
如果初值个数 >数组长度,则作 语法错误 处理;
如果初值个数 <数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为 空字符 (?\0?);
如果初值个数 =数组长度,则在定义时可省略数组长度。
2.字符数组的初始化
(2) 用字符串来初始化字符数组例如,char a[11] = {”I am a boy”};
I a m a b o y \0
char ch[6] = {“Hello”};
char ch[6] =,Hello”;
char ch[ ] =,Hello”;
4.4.2 二维字符数组一维字符数组存放一个字符串,二维字符数组可存放多个字符串。
char weekday[7][10]=
{,sunday”,”monday”,”tuesday”,”wendnesday”,”th
ursday”,”friday”,”saturday”};
第二维长度不能省略,应按最长的字符串长度设定例 4-7 输出如下图所示的钻石图形
*
* *
* *
* *
*
*
* *
* *
* *
*
#include <stdio.h>
void 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”); }
}
假设有定义 char a[10];
1.用格式符? %c”逐个字符 输入输出,
4.4.3 字符串的输入与输出
scanf(“%c”,&a[0]);
printf(“%c”,a[0]); /*每次输入输出一个字符 */
2,用格式符? %s”整个字符串输入输出,
例 用 %s
main()
{ char str[5];
scanf(“%s”,str);
printf(“%s”,str);
}
用字符数组名,不要加 &
输入串长度 < 数组长度遇空格或回车结束自动加 ‘ \0?
用字符数组名,
遇‘ \0?结束例 main( )
{ char a[5]={?H?,?e?,?l?,?l?,?o?};
printf(“%s”,a);
}
例 main( )
{ char a[ ] =,Hello”;
printf(“%s”,a);
}
结果,Hello#-=*……
(直到偶然遇到 ‘ \0?)
h e l l o
0 2 31 4
结果,Hello
用? %s”输出时,
遇 ‘ \0?结束
,”双引号定义的字符串
,末尾自动添加结尾符
‘ \0?
main()
{
char a[] = {'h','e','l','\0','l','o','\0'};
printf("%s",a);
}
输出,hel
h e l \0 l o \0
数组中有多个 ‘ \0?时,
遇第一个结束例如:
char s1[5],s2[5];
scanf("%s%s",s1,s2);
C \0
P r o g \0
则字符数组 s1和 s2
的存储情况如右图所示若输入数据:
C Prog↙
用? %s”输入时,遇空格或回车键结束
1.用字符串输入函数 gets实现输入,
字符串输入输出函数的函数原型在头文件? stdio.h”中被说明,调用该函数时,应在程序中加入文件包含命令:
#include"stdio.h"
函数功能,从键盘输入一以回车结束的字符串放入字符数组中,并自动加 ‘ \0’
调用形式,gets(字符数组) ;
举例,char a[10];
gets(a);
printf(" %s",a);
4.4.4 字符串处理函数
2.用字符串输出函数 puts实现输出
函数功能,向显示器输出字符串 ( 输出完,换行 )
调用形式,puts(字符串 /字符数组 ) ;
应用举例,char a[10];
gets(a);
puts(a);
【 例 】 将字符串 s1从第 m个字符开始剩余的所有字符,送入字符数组 s2中。
#include "stdio.h"
void main()
{int i,j,m;
char s1[80],s2[80];
printf("input a string:\n");
gets(s1);
printf("input start point:\n");
scanf("%d",&m);
i=m-1; j=0;
while(s1[i]!='\0')
{s2[j]=s1[i]; i++; j++; }
s2[j]='\0';
puts(s2);
}
以下函数在使用时应在程序头文件处添加声明
#include,string.h”
3.计算字符串长度的函数 strlen(字符数组 )
函数功能,求出字符串或字符数组中实际字符个数
(不包括 '\0')。
#include "stdio.h"
#include "string.h"
void main()
{ static char st[20]={"hello\0abce\0abc\0"};
printf("%d\n",strlen(st));
}
4,strupr(字符数组 )
函数功能,将字符串中的小写字母转换为大写字母。
5,strlwr(字符数组 )
函数功能,将字符串中的大写字母转换为小写字母。
6,字符串比较函数 strcmp(字符串 1,字符串 2)
函数功能,
从左到右逐个比较两个字符串 s1,s2
中各个字符(用字符的 ASCII码比较),
直到出现不同字符或遇到结束标记为止。
例如,strcmp(" d "," abc ") 结果为正整数。
strcmp(" dog "," door ") 结果为负整数。
函数返回值:
函数值 =
0 当串 1=串 2
负整数 当串 1<串 2
正整数 当串 1>串 2
函数应用举例,
说明,字符串比较不能用? = =?,必须用 strcmp
7.字符串连接函数 strcat(字符数组 1,字符数组 2)
函数功能,
删去字符串字符数组 1的结束标志 '\0',将字符串或字符数组 2连同末尾的结束标记一起连接到字符数组 1尾部,返回连接以后的字符串 。
应用举例
char a[20]="My name is ",b[10]="Li ming";
strcat(a,b);
执行 strcat(a,b) 后 a数组如下:
M y n a m e i s L i m i n g \0
函数功能,用是将字符数组 2复制到字符数组 1中去。
返回被复制的字符串。
函数说明:
字符数组 1长度应 ≥字符串或字符数组 2的长度;
字符数组 1应写成数组名的形式;
复制时连同通字符串后面的‘ \0?一起复制过去。
8,字符串拷贝函数 strcpy(字符数组 1,字符数组 2)
例 char str1[20],str2[20];
str1 = {“Hello!”}; (× )
str2 = str1; (× )
strcpy( str2,str1 ); (√)
不能使用赋值语句为一个字符数组赋值例如,char a[10]="abcdefghi",b[]="happy";
strcpy(a,b);
函数应用举例:
a数组内存原始情况,a b c d e f g h i \0
函数调用后 a,b数组内存情况,h a p p y \0
h a p p y \0 g h i \0
【 例 】 分析下面程序的运行结果。
#include "conio.h"
#include "string.h"
#include "stdio.h"
void main()
{ char c1[10]="abcdefghi",c2[]="china";
strcpy(c1,c2);
puts(c1);
printf("%c",c1[7]);
}
9,strcpy(字符数组 1,字符数组 2,n)
函数功能,用是将字符数组 2中前 n个字符赋值到字符数组 1中去。
应用举例,
char str1[6]=“the”,str2[5]=“sell”;
printf(“%s”,strncpy(str1,str2,2) );
结果是,see
例 4-10 输入一行字符,统计其中英文字符、数字字符、空格及其他字符的个数。
#include <stdio.h>
#include <string.h>
#define Size 100
main()
{ char str[Size];
int len,i,letter=0,digit=0,space=0,other=0;
printf(“pleaseinput a string\n");
gets(str);
len=strlen(str);
for( i=0;i<len;i++)
{ if((str[i] >=?a?&& str[i] <=?z?) ||
(str[i] >=?A?&& str[i] <=?Z?)) letter++;
else if(str[i] >=?0?&& str[i] <=?9?) digit++;
else if(str[i] ==) space++;
else other++;
}
printf(”%d letters;\n%d digit \n %d space\n %d other\n ",
letter,digit,space,other);
例 4-11 从键盘上输入 5门课程的名字,按字典顺序输出最前面的课程名字,
#include <stdio.h>
#include <string.h>
void main()
{ int i; char str[30],min[30];
printf(“please enter five courses names:\n”);
gets(str);
strcpy(min,str);
for(i=1;i<5; i++)
{gets(str);
if (strcmp(str,min)<0) strcpy(min,str);
}
printf(“the min is:”);
puts(min);
}
例 4-12 任意 输入一行字符,统计其中有多少个单词。
输入一字符串给 str
i=0 num=0 word=0
当 ((c=str[i])!=?\0?)
c=空格真真假假
word=0 num=num+1
word=1
i=i+1
输出,num
word==0
#include <stdio.h>
main()
{ char string[100];
int i,num=0,word=0;
char c;
gets(str);
for(i = 0; (c=str [i])!=?\0? ; i++)
if( c = = ' ' )
word = 0;
else if(word = = 0)
{num++;
word = 1;}
printf("There are %d words \
in the line\n",num);
}