数组
一维数组
数组就是从某个地址开始连续若个位置形成的元素集合,定义格式:数据类型 数组名[数组大小]; 数组大小必须是整数常量,不可以是变量,只能访问下标为0~size-1的元素
一维数组的初始化,需要给出用逗号隔开的从第一个元素开始的若干个元素的初值,并用大括号括住,未被赋初值的元素一般情况默认初值为0
冒泡排序
冒泡排序的本质在于交换,相邻的两个元素进行比较,利用中间量将较大的数放在后面一个位置,和后面的元素继续进行比较,直到放到最后一个位置,进行n-1趟便可以将数组从小到大进行排序
二维数组
二维数组是一维数组的扩展,格式:数据类型 数组名[第一维大小][第二维大小];
特别提醒:如果数组大小较大(大概级别),则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全局变量来自静态存储区,允许申请的空间较大
memset——对数组中每一个元素赋相同的值
利用memset函数可对数组中每一个元素赋以相同的值,注意使用memset函数需要在程序开头添加string.h头文件,memset函数的格式为:memset(数组名, 值, sizeof(数组名));
memset使用的是按字节赋值,即对每个字节赋相同的值,这样组成int型的4个字节就会被赋成相同的值。由于0的二进制补码为全0,-1的二进制补码全为1,所以可利用memset赋0或-1,如果要对数组赋其他数字,则使用fill函数(但是memset速度更快)
字符数组
字符数组的初始化
字符数组也可以像普通数组那样进行初始化,也可以通过直接赋值字符串来初始化(仅限于初始化,程序其他位置不允许这样直接赋值整个字符串)
字符数组的输入输出
scanf输入,printf输出
scanf对字符类型有%c和%s两种格式,printf同理。对于scanf而言,%c用来输入单个字符,能够识别空格跟换行并将其输入,%s用来输入一个字符串并存在字符数组里,通过空格或换行来识别一个字符串的结束,同时后面对应数组名前面是不需要加&取地址运算符的
getchar输入,putchar输出
getchar和putchar用来输入和输出单个字符,getchar可以识别换行符
gets输入,puts输出
gets用来输入一行字符串,识别换行符作为输入结束,将其存放于一维数组;当输入多行,利用getchar接收换行符后再继续使用gets,将其存放于二维数组
puts用来输出一行字符串,即将一维数组(或二维数组的一维)在界面上输出,并紧跟一个换行符
字符数组的存放方式
在一维字符数组(或是二维字符数组的第二维)的末尾都有一个空字符\0,以表示存放的字符串的结尾。在使用gets或scanf输入字符串时会自动在输入的字符串后面添加一个空字符,并占用一个字符位,而puts和printf就是通过识别空字符作为字符串的结尾来输出的
注意:空字符\0,即NULL,其ASCII码为0(区别:空格的ASCII码为32),占一个字符位,字符数组的长度一定要比实际存储字符串的长度至少多1;如果使用getchar输入字符串,需要在输入的字符串后加入空字符\0,否则printf和puts输出字符串会因无法识别字符串末尾而输出一大堆乱码
string.h头文件
strlen()
strlen函数可以得到字符数组中第一个\0前的字符的个数,格式:strlen(字符数组);
strcmp()
strcmp函数返回两个字符串大小的比较结果,比较原则是按字典序(就是字符串在字典中的顺序),格式:strcmp(字符数组1, 字符数组2);
返回结果:如果字符数组1<字符数组2,则返回一个负整数;如果字符数组1==字符数组2,则返回一个0;如果字符数组1>字符数组2,则返回一个正整数
strcpy()
strcpy函数可以把字符串2复制给字符串1,包括字符串2结束时的空字符\0,格式:strcpy(字符串1, 字符串2);
strcat()
可以把一个字符串连接到另一个字符串后面,连接从空字符所在的字符位开始,格式:strcat(字符串1, 字符串2);
sscanf与sprintf
sscanf(str, "%d", &n)的作用是把字符数组str中的内容以"%d"的格式写到n中(还是从左至右);sscanf支持正则表达式
sprintf(str, "%d", &n)的作用是把n以"%d"的格式写到字符数组str中(还是从右至左)