1.数组
数组是一组有序的、类型相同的数据的集合,这些数据被称为数组的元素。
每个数组都有一个名字,我们称之为数组名。
数组名代表数组的起始地址。 数组元素由索引或下标标识,索引或下标从0开始
数组的特性必须在使用前定义:
存储类型 数据类型 数组名 数组大小
数组定义的语法
存储类型 数据类型 数组名[数组长度] ;
例如:int player[11];
数组名后接一个或多个括在方括号内的表达式,用以指定数组的维数 数组长度只能是常量和常量表达式(大于0)
规范
所有数组元素具有相同的类型
允许使用变量的地方都可以使用数组元素
可以使用整型表达式引用数组的元素: 数组名[整型表达式]
(1)一维数组
一维数组在内存中的存放,地址是连续的!
格式 :type 函数名[长度];
自动数组中的元素需要分别初始化
extern和static修饰的数组元素自动初始化为 0
数组初始化是在数组定义时给元素赋初值
初始化赋值的一般形式
类型 数组名[常量表达式]={值,值…};
例如:int ary[10]={0,1,2,3,4,5,6,7,8,9};
初始化的几点规定
元素之间用逗号隔开 可以只给部分元素赋值,剩余元素赋0值
给全部元素赋值时,可以不说明元素的个数
注: ·C编译器不会检查下标的越界 ,即使两个数组的类型和大小相同,也不能检验其是否相等
·不能直接将一个数组赋给另一个数组
·不能为数组整体赋值
(2)二维数组
可以看成是由两个一维数组组成的数组 ,类似于一个由行和列组成的表格。
存储形式
二维数组在内存中是按行的顺序存放的,即先存放第一行的元素,再存放第二行的元素。
二维数组的声明方式
类型说明符 数组名[常量表达式1][常量表达式1];
例如:int temp[4][3];
初始化及四种形式
数据类型 数组名[常量表达式1][常量表达式2]={初始化数据}
(1) 分行给二维数组赋初值。
如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2) 可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。
如: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3) 可以对部分元素赋初值。
如 int a[3][4]={{1},{5},{9}};
其他部分会自动赋值为0;
(4)如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不 能省。
如: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};
二维数组元素的引用
数组名[行下标][列下标]
例如:a[1][3] = 12;
(3)字符数组
与字符串的关系
C语言没有专门的字符串变量,字符串的存储必须通过字符数组来实现。
一维字符数组用于存储1个字符串(每个元素存放1个字符)。
二维字符数组用于同时存储多个字符串(每一行存储1个字符串)。
空字符‘\0’自动添加到字符串的内部表示中止,它占内存但不记入字符串长度
字符数组的定义、初始化和元素的引用与一般的数组相同。
可以将字符串常量赋给字符串变量
声明字符串变量
格式 char str[10];
在声明字符串变量时,应该为这个空结束符预留一个额外元素的空间
str是一个字符数组变量,它最多可以容纳包括空结束符在内的10个字符
注:当初始化的字符(至少要有一个)少于字符数组的长度时,未初始化部分将被编译系统自动用空字符‘\0’赋值。
字符串变量的使用
字符串也是一维数组,同样享有一维数组的所有特征
例如:
char str1[20] = “abc”,str2[20]; str2 = str1; /*错误*/
str2 = “abc”; /*错误*/
str1 == str2; /*没意义*/
同样可以通过数组名与下标访问其数组元素。
例如:
char str[6] = “hello”; str[0] = ‘H’;
/*把字符h改成字符H*/ 字符串可以通过系统函数进行整体操作
2.字符串函数
(1)输入-gets()
功能说明:
是接受通过标准输入所获得的字符串的最简单的方法。
它接受按下回车键以前输入的所有字符(包括空格),并用“\0”字符替换末尾的换行符“\n”。
函数原型:
char *gets(char *buffer);
buffer存放输入数据的首地址
返回值:成功时返回输出缓冲区首地址,否则返回NULL
例如:
char name[50]=“”;
printf(“enter your name:”);
gets(name);
(2)输出-puts()
功能说明:
用于在标准输出设备上显示字符串,并把末尾的字符串结束符 “\0”替换成换行符“\n”字符输出(自动换行的原因)
函数原型:
int puts(const char *string);
string输出数据的首地址
返回值:成功时返回最后一个字符的ASCII码('\n'),否则返回EOF
例如:
puts(“my name is”); /*会输出换行符*/
puts(name);
(3)格式化-sprintf()
功能说明:
将其他数据类型转换成字符串类型并输出到指定字符串中.
函数原型:
int sprintf( char *buffer, const char *format [, argument] ... );
*buffer指定字符串的首地址
函数参数:
buffer是字符数组名
format是格式化字符串
返回值: buffer中字符的个数 ,否则返回EOF
补:
1、格式化数字字符串 (itoa)
sprintf(s, "%d", 123);
2、控制浮点数打印格式
sprintf(s, "%.3f", 3.1415626);
3、连接字符串 (strcat)
sprintf(s, "%s love %s.", “i”, “CSDN ”);
4、打印地址信息
sprintf(s, "%p", &i);
5、利用sprintf的返回值 (strlen)
int len = sprintf(s, "%d", i);
(4)长度计算-strlen()
功能说明:确定字符串的长度,不包括'\0'的长度
函数原型:
int strlen(const char *string);
*string求长度的字符串首地址
返回值:字符串实际长度,即字符串中'\0'之前的字符个数
(5)复制-strcpy()
功能说明:将一个字符串中的值复制到另一个字符串中
函数原型:
char* strcpy(char *dest,const char *source);
*dest目标字符串首地址 *soure要复制的字符串首地址
返回值:成功时返回dest,否则返回NULL
说明:dest必须足够大以便能够容纳被复制的字符串。建议使用strncpy()函数
(6)连接-strcat()
功能说明:将两个字符串连接成一个字符串(将source 接到dest的末尾)
函数原型:
char *strcat(char *dest,const char *source);
*dest目标字符串首地址 *soure要连接的字符串首地址
成功时返回连接成功后的首地址即dest,否则返回NULL
说明: dest必须足够大。
连接时只在新串最后保留一个‘\0’
(7)比较-strcmp()
功能说明:比较两个字符串并根据比较的结果返回一个整数值
函数原型:
int strcmp(const char *str1,const char *str2);
函数返回值的情况如下:
如果 str1<str2,则返回值小于零
如果 str1 与 str2 相同,则返回值等于零
如果 str1>str2,则返回值大于零
比较原则:从左至右逐个对应字符按其 ASCII码值大小相比较,直到出现不同的字符或遇到‘\0’为止。
(8)字符是否存在-strchr()
功能说明:判断某个字符是否在字符串中出现
函数原型:
char* strchr(const char *str,char ch);
*str字符串首地址 ch要查找的字符
该函数返回值的情况如下:
如果该字符在字符串中出现,将返回对应这个字符(由 chr 所指向的)在字符串 str 中第一次 出现的指针。
如果未出现,则返回 NULL。
(9)字符串是否存在-strstr()
功能说明:判断某个字符子串是否在一个字符串中出现
函数原型:
char* strstr(const char *parent,const char *sub);
*parent字符串首地址 *sub要查找的字符串
该函数返回值的情况如下:
如果该字符串sub在parent字符串中出现,将返回对应这个字符串(由 sub 所指向的)在字符 串 parent 中第一次出现的指针
如果未出现,则返回 NULL
(10)大小写转换-strupr()/strlwr()
strlwr函数
其一般形式为:strlwr (字符串)
strlwr函数的作用是将字符串中大写字母换成小写字母。
strupr函数
其一般形式为:strupr (字符串)
strupr函数的作用是将字符串中小写字母换成大写字母。
(11)其他
sscanf()
格式化数字字符串 (atoi)
char name[12];
int x=0;sscanf(“123 admin”, "%d %s", &x,name);