目录
7.4.2.5 strcmp()函数比较字符串ascii码的大小
第七章的剩余部分
7.4 字符数组
用来存放字符的数组是字符数组。主要用途有:处理文本,装字符串等。
7.4.1 字符数组的定义
字符数组的定义方法与上篇记录的整型数组类似。
不同之处:
(1)默认在字符数组的末尾加上一个不可见的字符'\0',作为整个字符串结束的标志。
如上图所示:整个字符串所占的字节是14个字节而不是13个字节,因为字符串末尾会默认加上’、0‘。此外“”双引号引起来的是字符串常量,不能更改。
数组初始化的过程如上图所示
格式为:类型说明符 数组名[常量表达式];
需要注意的是:数组定义的空间要足够大才可以。不然会造成越界访问,从而产生严重的错误。
那么我们要解决的问题是,如何那字符数组存放一段真正的字符串?而非字符串常量呢。
7.4.2 字符型数组的基础算法
7.4.2.1 字符串遍历
7.4.2.1.1 puts()函数
如图所示:putchar(int)实参应为int型,若放一个字符型会自动转为int型。
也可以通过调用puts(char *)函数来实现上述功能。
7.4.2.1.2 gets()函数
从键盘输入字符串的方式可以简单使用三种函数scanf(s),gets(s),fgets(s,sizeof(s),stdin).s为数组,sizeof(s)是数组s所占的字节数。
需要注意的是:
(1)若输入字符串长度超过数组的容量,虽然gets函数可以正常调用,但会导致越界访问
(2)调用scanf函数时,若输入换行符、空格、回车和tab键都会默认为结束。
(3)gets()函数不会输出回车。
可以根据自身的需要来进行选择。
7.4.2.2 strlen()函数
strlen函数统计当前的有效字符个数。
因为中的字符串有效字符数一定不会是负数,故定义一个unsigned变量更为准确。s[100]是创建一个足够大空间的数组。
此外需要注意的是:
真正打印在终端的都是字符串(文本)。
如 : int i = 1234;此时i里面装的是 1234的补码。
int i[] = "1234",此时i里面装的是'1','2'...的ascii码。
故:puts(1234) 是错误的
正确的应该是puts("1234"),"1234"是匿名数组,是常量只能为右值。
printf打印也是要把 1234 转变为"1234"才可以打印。
7.4.2.3 strcpy()函数赋值
算法思想如下:将数组s1的元素赋给数组s2.从s1中依次逐个拿出对应位置的有效字符赋给s2。并在拷贝过程结束后,在s2中的有效元素后补一个'\0'。
strcpy(目标,源)函数同样能够实现上述过程。把源数组内的字符拷贝到目标数组内。
7.4.2.4 strcat()函数拼接
把数组s2拼接到数组s1的后面,先while循环确定s1中有几个有效字符,此时循环结束时的i是原s1数组中‘\0’的下标。
再进行一次while循环,并把s2[j]的值赋给s1[i],初始的j=0;再进行++i,++j,直至s2中再无有效字符。
此时s1中的有效字符后并无‘\0’,为随机数,故手动加上‘\0’,s1[i] = '\0'
同样,通过调用strcat()函数也可以实现上述功能。
char *strcat(目标,源)
7.4.2.5 strcmp()函数比较字符串ascii码的大小
int strcmp(s1,s2)
调用strcmp函数是会返回三个结果:返回值为s1[i] - s2[i]
(1)返回值>0 s1 > s2
(1)返回值=0 s1 = s2
(1)返回值<0 s1 < s2
7.4.2.5 逆序
逆序的实现与整型数组类似。
实例:判断三个数组谁大
7.4.3 二维数组
二维数组(整型/字符串)本质是数组的数组。
例:a[3][4]为三行四列的表格,有三个元素(有三个一维数组)
引用方式 是从0开始
例:从a[0][0] = 1开始逐一递增赋值。
a[0]的地址比a[1]的地址小
a[0][1]是第一个一维数组的第二个元素。
注意:二维数组同样不得被整体访问,需要两个for循环来遍历
第一个花括号里初始化a[0]向后递增,有三个元素,每一个元素都是长度为4的一维数组。
注意:初始化二维数组时不加花括号也行。但若想让中间元素为0 就不行了,只能省略行数,不能省略列数。tips/:只能省略靠近变量名的那个
7.4.3.1 二维数组算法(计算行数,列数)
实现动态分析
7.4.3.2 二维数组算法(平均数)
53行有错误 后面应为(float)(sum)/couter。