(内容为学习笔记,如有错误,还望指正,如有遗漏,还望补充)
1.整型数组
1)数组的定义
数组是一种数据结构,它可以储存多个相同类型的元素。整型数组,顾名思义就是元素是整型的数组。
2)如何定义一维整型数组
int a[5];
元素类型 数组名[元素个数];
3)如何初始化
数组初始化的方式有三种,分别是完全初始化,部分初始化和默认初始化,前两种都需要定义数组时指明数组的元素个数,具体如下。
//完全初始化
int a[5] = {1,2,3,4,5}; //定义一个整型数组a,他有5个元素分别是1,2,3,4,5
//部分初始化
int a[5] = {1,2}; //定义一个整型数组a,他有5个元素分别是1,2,0,0,0
//默认初始化
int a[] = {0,1,2,3,4,0,4}; //定义一个整型数组a,他有7个元素分别是0,1,2,3,4,0,4
4)一维整型数组的应用
在程序编写中,很多时候都会遇到需要定义数个相同类型变量的时候,如果这些变量的应用场景适用范围的作用没有太大的区别,通常会用数组来降低程序的理解难度。
例如,我们需要登录十个同学的成绩,如果每个人的成绩都以他们各自的名字来命名为变量,就显得过于复杂,如果出现重名的学生也会变得很麻烦,如果每个学生都有一个属于自己的编号,即学号,那将他们的成绩都已编号的形式存在一起就会很方便,使用数组就是一个非常不错的选择。
以下代码反映了上述的过程,可以注意到,定义数组时写int a[10],此处的10说明了数组有10个元素,而运用数组是,数组的下标为0~9,即a[0],a[1],a[2]...a[8],a[9]。
int a[10];
for(i = 0; i < 10; i++)
{
scanf("%d",&a[i]); //输入每个学生成绩
}
for(i = 0; i < 10; i++) //遍历并打印整个数组
{
printf("%d ",a[i]);
}
printf("\n");
2.字符数组和字符串
(由于这部分涉及到一些指针的知识,可能写的不是很细)
1)字符串
在C语言中字符串常量必须由""包含,当由""包含字符串时,系统会默认在尾部加上'\0'。
"hello world"//是字符串常量,12个字符,'\0'是字符串中不可缺少的字符
"w"//是字符串常量,2个字符,'w' '\0'
""//是字符串常量,1个字符 '\0'
//输出'\0'什么显式都没有。'\0'存在唯一的意义就是作为字符串的结尾。
2)字符串要点
a.'\0' 是由c编译系统自动加上的。 只要写""就会补'\0'
b.字符串常量是由双引号引起来的。
c.字符串长度 计算字符串的长度,不算结尾的 '\0' "hello" 字符串长度是5。
d.字符串占内存的大小(长度) 就是字符串在内存中移动占的字节数,要算'\0','\0'也是一个字符,只不过输出的什么都没有。"hello" 占内存6个字节。
3)字符数组初始化
char s[] = "hello"; //默认初始化,s是字符串,s中有6个元素
char a[] = {'h','e','l','l','o','\0'}; //默认初始化,a是字符串,a中有6个元素
char b[] = {'h','e','l','l','o'}; //默认初始化,b不是字符串,b中只有5个元素
char c[10] = {'h','e','l','l','o'}; //部分初始化,其他元素默认补0,c中数据是字符串,因为0就是'\0'
区分:
0 整数零,ascii码为0。
'\0' 字符杠零 ,ascii码为0,字符杠零就是整数零。
'0' 字符零,就是一个普通字符,ascii码为48,和上面两者没有关系,没有任何特殊的含义。
4)字符输入输出函数
输入函数:
getchar();//从输入缓存中输入一个字符,执行一次只能输入一个字符
输出函数:
putchar();//向输出缓存输出一个字符
例子:
int main()
{
char a;
a = getchar(); //输入一个字符,将输入的字符放在变量a中。
putchar(a); //输出一个字符a
putchar('\n'); //再输出一个\n
return 0;
}
5)字符串输入输出函数
输入:
gets();//相当于scanf("%s");
输出:
puts();//相当于printf("%s");
例子:
int main()
{
char buf[100]; //字符数组用于存放我们输入的字符串
printf("gets输入\n");
gets(buf); //将输入的字符串放到数组buf中
printf("puts输出\n");
puts(buf); //输出数组buf中存放字符串,会在输出后自动加\n
printf("scanf 输入\n");
scanf("%s", buf); //将输入的字符串放到数组buf中,scanf输入字符串时,遇到空格结束
printf("printf输出\n");
printf("%s\n", buf); //输出数组buf中存放字符串
return 0;
} //数组名就是地址,只想数组首元素的地址
6)字符串处理函数
头文件:
#include<string.h>
函数:
a.求字符串长度函数 :
int strlen(const char *string);
//参数:存放字符串的数组名或者字符串常量
//返回值:字符串长度,字符串长度不包含'\0'
str[10] = "hello";
printf("%d\n",strlen(str)); //输出5
b.字符串拷贝函数:
char *strcpy(char *strDestination, const char *strSource);
//参数1:目标数组的数组名,要把字符串拷贝到这个数组里,我们自己保证数组得够长。
//参数2:要拷贝的字符串,可以是存放字符串的数组名,也可以是字符串常量
//返回值:参数1
char str[10] = "hello";
char dst[10];
strcpy(dst,str);
printf("%s\n",dst); //输出hello
c.字符串连接函数:
char *strcat(char* strDestination, const char* strSource);
//参数1:存放字符串的数组,保证长度够长。将字符串拼接到这个数组中存放的字符串的后面
//参数2:要拼接到后面的字符串,可以是存放字符串的数组名,也可以是字符串常量。
//返回值:参数1
char str[10] = " world";
char dst[20] = "hello";
strcat(dst,str);
printf("%s\n",dst); //输出hello world
d.字符串比较函数:
int strcmp(const char *string1, const char *string2);
//参数1:比较的第一个字符串,可以是存放字符串的数组名,也可以是字符串常量
//参数2:比较的第二个字符串,可以是存放字符串的数组名,也可以是字符串常量
//返回值:返回值不是表示真假的值,而是两个字符串中首个不相同字符的ascii码差值
char str1[10] = "hello";
char str2[10] = "helln";
printf("%d\n",strcmp(str1,str2)); //输出'o'和'n'的ascii码差值1
3.随机函数
1)头文件
#include<stdlib.h> //包含了很多有用的函数,包含了本次要说的随机函数
#include<time.h>
2)用法
srand(); //设置随机种子的函数,后面生成的一系列随机数,都是根据种子数计算出来的。
//seed random set random
rand(); //random 产生一个随机数,每调用一次rand()会产生一个随机数
time(); //获得当前时间,单位是秒
具体用法如下。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
srand(time(0));//为了让随机看上去更加的真实,我们使用当前的时间作为种子数,time(0)是固定用法获得当前时间的功函数,时间从1970年1月1日到现在的秒数,只要程序不是在同一秒内运行,那么生成的随机数就不一样
int i;
for(i = 0;i < 10;i++)
{
int r = rand()%100;//rand生成的随机数,是无符号int全范围的数,范围太大,所以我们会使用%限制范围,%100将随机数范围限制在0~99
printf("%d ", r);
}
printf("\n");
return 0;
}
关于rand()%100,其意义在于将随机数压缩到0~99这100个数的范围,也就是说对n求余,得到的就是0~n-1这n个数的值域范围。
例如我想要随机数保持在-10~10这21个数之中,就可以写int r = rand()%21-10;"。
小知识:
函数time(0)返回自Unix纪元(1970年1月1日)以来的当前时间(以秒为单位)。