一、数组
数组的基本概念:数组就是用来存储一组数据的。
使用数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。
素组的特点:只能存放一种数据类型,比如int 类型的数组、float 类型的数组,里面存放的数据称为“元素” 。
1.一维数组
数组的定义格式: 类型 数组名[元素个数]
定义的例子:
int ages[50] = {1,2,3,4,....,50};
ages[1] = 2; //数组元素的访问
int ages[5] = {10,11}; //给前两个元素赋值
int ages[5] = {[3] = 10,[4] = 11}; //给后两个元素赋值
//在c语言中可以不写数组元素的个数
int ages[] = {10,11,14};
//这种写法是可以的,字符与int可以相互转换
int ges['A'] = {10,11,12,13,14};
错误的定义方法:
1.int ages[];
//只能在定义数组的同时进行初始化
2.int ages[5];
ages = {10,11,12,13,14};
//如果想在定义数组的同时进行初始化,数组元素必须放常量
3.int count = 5;
int ages[count] = {1,2,3};
可以改成下面的形式:定义数组和初始化不同时进行
int count = 5;
int ages[count];
ages[0] = 1;
ages[1] = 2;
内存分析:
如何计算数组元素的个数
int ages[] = {10,22,33,44};
int count = sizeof(ages)/sizeof(int)//这就是面向过程
存储空间的划分(内存的分配时是从高地址到低地址进行的,但一个数组内部元素又是从低到高进行的) ;
数组名代表数组地址 ;
数组操作常见问题:数组下标越界异常
如 int args[2] = {1,2};
Printf("输出数组的第三个元素:%d",args[2]); 访问到了数组不存在的下标时发生。
数组的其他使用:
数组作为函数参数,可以省略元素个数。
数组作为函数参数,传递的是整个数组的地址,修改函数形参数组元素的值,
会影响到外面的实参数组。
注:将数组名当做函数参数传递时,函数会把数组当做指针变量来使用,指针变量在64bit编译器环境下,占据8个字节。所以在函数中不能计算数组元素的个数。
2.数组中的数组
也称多维数组,以二维数组为例。
二维数组是一个特殊的数组:它的元素是一维数组。
初始化方式:
方法一:在定义的同时赋值
int a[3][2] = {0};//所有元素都为0
方法二:常规的赋值方法
int a[3][2]= {1,2,3,4,5,6};
方法三:分行赋值
int a[3][2] = {{1,2},{3,4},{5,6}};
方法四:部分赋值法
int a[3][2] = {{1,2},{0},{5,6}};
方法五:
int a[3][2]; //先定义
for(int i = 0;i<3;i++) //用双重for循环赋值,i 和 j 表示二维数组下标
for(int j = 0;j<2;j++)
scanf("%d",&a[i][j]);
注意错误:
int a[3][2];
a[3] = {};//因为每个元素为一个数组
二、字符串
什么是字符串:
很多个字符组合在一起就是字符串。
'\0' 是字符串结束标志。
字符串的初始化:
char name[8] = "jack";
char name2[8] = {'j','a','c','k','\0'};
char name3[8] = {'j','a','c','k',0};
以上三种方式在在内存中存储方式一样,字符串用数组存储。
char name4[8] = {'j','a','c','k'}; // 会有警告,最好加上‘\0’结束标志
char name5[] = {''j,'a','c','k'}; // 不算一个字符串,只能说是一个字符数组
字符串的输出 "%s" , '\0' 是不会输出的
常用字符串处理函数:
1.strlen函数:计算字符串的长度(不包括字符串结束标志 '\0')。
strlen函数声明在string.h 文件中;
计算的是字符数,并不是字数;
计算的字符不包括 '\0';
从某个地址开始数字符的个数,直到遇到' \0' 为止;
#include"string.h"
main()
{
int k;
static char st[]="C Language";
k=strlen;
printf("The lenth of the string is %d\n",k);
}
2.字符串输出函数 puts 格式:puts(字符数组名) 功能:把字符数组中的字符串输出到显示器。
#include"stdio.h"
main()
{
static char c[]="BASIC\ndBASE";
puts(c);
}
3.字符串输入函数gets 格式:gets(字符数组名) 功能:从标准输入设备上
输入一个字符串。
#include"stdio.h"
main()
{
char st[15];
printf("input string:\n");
gets;
puts;
}
tips:gets函数并不以空格作为字符串输入结束的标志,而只是以回车作为输入结束,这是与scanf不同的部分
4.字符串连接函数strcat 格式:strcat(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串连接到字符数组1中字符串后面,并删去字符串
1后的串标志"\0",本函数返回字符数组1的首地址。
#include"string.h"
main()
{
static char st1[30]="My name is ";
int st2[10];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
}
5.字符串拷贝函数strcpy 格式:strcpy(字符数组名1,字符数组名2)
功能:把字符数组2中的字符串拷贝到字符数组1中,串结束标志 "\0"也一同
拷贝,字符数组2也可以是一个字符常量,就相当于把一个字符串赋予一个字符数组
#include"string.h"
main()
{
static char st1[15],st2[]="C Language";
strcpy(st1,st2);
puts(st1);
printf("\n");
}
6.字符串比较函数strcmp格式:strcmp(字符数组1,字符数组2) 功能:
按照ASCII码顺序比较两个数组中的字符串,并有函数返回值返回比较结果
#include"string.h"
main()
{
int k;
static char st1[15],st2[]="C Language";
printf("input a string:\n");
gets(st1);
k=strcmp(st1,st2);
if(k==0) printf("st1=st2\n");
if(k>0) printf("st1>st2\n");
if(k<0) printf("st1<st2\n");
}
三、小练习
数组练习:
/*
随机产生个以内的数,按从小到大的顺序排序输出
思路:冒泡排序法
*/
#include <stdio.h>
int main()
{
//定义一个一维数组
int nums[5];
//请用户输入个以内的整数
printf("请输入个以内的整数,以逗号分隔:");
//用scanf函数接收这些数字
scanf("%d,%d,%d,%d,%d",nums);
//定义第三方变量
int temp ;
//冒泡排序法
for(int i = 0;i < 4;i++)
{
for(int j = i+1; j < 5;j++)
{
if(nums[i] > nums[j])
{
temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
}
//遍历数组
for(int i = 0;i < 5;i++)
{
printf("%d",nums[i]);
}
return 0;
}
输入5个数字:5,89,77,99,1
运行结果:1,5,77,89,99
字符串数组:
/*
从键盘输入个字符串(仅仅包含英文字母和数字)
对这个字符串从小到大排列并输出结果。
*/
#include <stdio.h>
#include <string.h>
int main()
{
//定义一个二维数组
char ary[6][20];
//请用户输入字符串
for(int i = 0;i < 6;i++)
{
printf("请输入第%d个字符串,仅仅包括英文字母和数字:",i+1);
scanf("%s",ary[i]);
}
for(int i = 0;i < 5;i++)
{
for(int j = i+1;j < 6;j++)
{
if(strcmp(ary[i],ary[j]) > 0)
{
//定义一个第三方变量
char temp[50];
//将最小值排在前面
strcpy(temp,ary[i]);
strcpy(ary[i],ary[j]);
strcpy(ary[j],temp);
}
}
}
printf("由小到大排序:");
//遍历数组
for(int i = 0;i < 6;i++)
{
printf("%s",array[i]);
}
return 0;
}
字符串操作:
/*
遍历字符串,找到与某个字符相同的字符,就返回,没有就返回
*/
#include <stdio.h>
#include <string.h>
int main()
{ //函数的声明
int char_contains(char str[],char c);
int result = char_contains("itcast",'t');
printf("%d",result);
return 0;
}
//定义函数
int char_contains(char str[],char c)
{
int i = -1;
while(str[++i] != c && str[++i] != '/0');
return str[i] == c ? 0 : 1;
}