字符数组
用来存放字符数据的数组叫字符数组。字符数组中每一个元素存放一个字符。
字符数组主要用于处理c中字符串的使用。
字符串:“hello world”用双引号引用起来的就是字符串,在双引号中,字符串中的字符不可更改。
字符串在内存当中按照先后次序排列起来
c语言中,规定了字符串的结束标志位是‘\0’,'\0'可以省略不写,处理器会自动添加
单一性:每一个字符占一个字节
有序性:字符串在内存中按顺序存放
连续性:占用一块连续的内存空间
字符数组的定义
在C语言中,字符数组的定义方式大概是这样的:
char str[6] = "hello";
这里,char 表示字符类型,str 是数组的名字,[6] 表示这个数组可以存储6个字符(包括最后的空字符\0,它是字符串的结束标志)。"hello" 就是被存储在这个数组中的字符串。
形如这样的数组就相当于一个容器:开辟出了一个占100个字节的数组空间,内容存放的是随机数
注意:这个定义的字符串的长度要足够大,最短也要是len+1
字符数组的初始化
对于字符串的声明和初始化,有以下规则:
字符数组的声明和初始化:
字符数组可以在声明时初始化,但不能直接用花括号 {} 进行赋值。
例如:char s[8] = "Beijing"; 是正确的,但 char s[8]; s = "Beijing"; 是错误的。
字符指针的声明和初始化:
字符指针在声明时可以不初始化,之后可以用赋值语句进行初始化。
例如:char *s; s = "Beijing"; 是正确的。
操作字符串不是用长度,而是末尾的\0
形参要和实参类型匹配,个数相等
二分法查找
定义一个a[begin]和a[end],令(begin+end)/2的值为mid,然后将需要查找的数与mid相比较,就可以确定n的范围,然后再根据第一次比较的结果移动begin或者end的位置,再次比较n与mid的大小,直到确定n的值。
字符串处理函数
1、puts函数
一般形式:puts(字符数组),作用是将一个以‘\0’结束的字符串输出到终端
函数原型: 形参为char*,实参传数组的数组名
puts函数和putchar实现的功能类似
指针数组:由指针构成的数组
2、gets函数
一般形式:gets(字符数组),作用是从终端输入一个字符串到字符数组
函原型:
get函数在使用时,因为预先定义的数组可能范围不够大,容易造成越界访问
为解决这一问题可以使用fgets函数
fgets的三个参数:要写入的地址;地址空间的长度(sizeof(a)/sizeof(s[0]));空间流
gets函数在使用时,会把空格当做是间隔符,然后空格后的就不会再输入了
3、strlen函数
一般形式为 :strlen(字符数组) 是测试字符串长度的函数,函数的值为字符串中的实际长度(不包括'0'在内)。
sizeof(s)是数组的长度,strlen是数组中有效元素的长度
数组不能整体赋值
4、strcpy函数
一般形式为 :strcpy(字符数组1,字符串2) 它是“字符串复制函数”,将字符串2 复制到字符数组1中。
char*:形参为char*,实参为数组的数组名(s[100]的数组名为s)
使用strcpy时,目标数组的长度一定要足够大,最少为strlen(s1)+1;
5、strcat函数
一般形式为:strcat(字符数组1,字符数组2) 其作用是连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值--字符数组1的地址。
使用strcat函数时,字符数组1必须足够大,可以容纳连接后面的新字符串
6、strcmp函数
一般形式为:strcmp(字符串1,字符串2) 它的作用是比较字符串1和字符串2。
比较的结果是看strcmp的返回值
>0 数组一大于数组二
<0 数组一小于数组二
=0 数组一和数组二相等
不能这样比较,这样比较的是两个数组在内存中地址的大小,两个数组在比较时,不能使用关系运算符。