微信公众号「编程学习基地」


目录




数组

数组的定义

  • 为什么要使用数组


单一的变量很难满足需求,这个时候多变量的集合数组出现了


  • 数组的定义

类型 数组名[数组大小];

int arr[100]; //定义100个int类型的变量

类型可以是int double float char 这些基本数据类型中的任意一种

  • 数组的初始化
int arr[10] = {1,2,3,4,5,6,7};  //初始化
arr[1] = 100; //赋值

数组元素的使用

  • 数组的使用方式
for(int i=0;i<100;i++)
{
arr[i]=i+1; //给数组赋值从1到100
}
下标运算符[]


[ ]里面的数字 称之为下标

下标从0开始

下标不能超过定义的数组大小


int arr[4];
arr[4] = 5; //错误写法 arr数组只有0,1,2,3这三个下标
  • 注意事项

  1. 初始化可以给一组数据赋值,后面用{} 括起你要赋值的数据,数据用逗号隔开
  2. 赋值的个数少 未赋值的用0赋值

#include<stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7}; //初始化
for (int i = 0; i < 10; i++)
{
printf("%d\t", arr[i]); //打印结果为1 2 3 4 5 6 7 0 0 0
}
printf("\n");
return 0;
}
  1. 定义数组的时候可以不指定数组大小,但必须初始化,系统自动分配大小
int arr[];        //错误  
int arr[]={1,2,3,4,5,6};//正确
  1. 数组的大小不建议省略

循环和数组的搭配

斐波那契数列


斐波那契数列:1 1 2 3 5 8 13 21 34… 每一个元素是前两个元素之和


#include<stdio.h>
int main()
{
int Fabo[20]={1,1};
//循环给Fabo数组赋值
for(int i=2;i<20;i++)
{
Fabo[i]=Fabo[i-1]+Fabo[i-2];
}
//输出斐波那契数列
for (int i = 0; i < 20; ++i)
{
printf("%d\t", Fabo[i]);
}
printf("\n");
return 0;
}

二维数组和多维数组

  • 数组的定义

类型 数组名[ 行 ] [ 列 ]

int Arr[3][4]={ { 1, 2, 3 }, { 1, 2 }, { 2, 3, 4, 5 } };  //初始化
Arr[0][0]=100; //赋值
  • 数组的使用方式 实例:​杨辉三角
#include<stdio.h>
#define N 10
int main()
{
int a[N][N]={{1},{1,1}};
int i,j;
for(i=2;i<N;i++)
{
for(j=0;j<=i;j++)
{
a[i][j]=a[i-1][j]+a[i-1][j-1]; //上方和左上角之和
}
}
//打印杨辉三角
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
{
printf("%d\t",a[i][j]);
}
printf("\n");
}
}

打印效果:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
Press any key to continue

字符数组

  • 字符串常量
  1. 什么是字符串常量


一般用一对双引号" "括起的一串字符来表示字符串常量​ 例如:“hello world”



  1. 字符串是一种非常重要的数据类型,但是C语言不存在显式的字符串类型,C语言中的字符串都以字符串常量的形式出现或存储在字符数组中。
  2. %s用于打印字符串

printf("%s", "hello world");
  • 字符数组
  1. 字符串只能用字符数组存放
char str[128];  //字符数组
printf("请输入一段文字\n");
scanf("%s", str);//让用户输入一个字符串
printf("用户输入的内容是:%s", str);
  • 字符串用’\0’ 作为字符串结尾


\0 对应的ASCII码是0


一般使用字符串的时候会自动加在后面

  • 一段代码让你了解字符串

首先输入下面的代码,运行

#include<stdio.h>
int main()
{
char arr[128];
printf("请输入一段文字:");
scanf("%s",arr);
printf("%s\n",arr);
for(int i=0;i<128;i++)
{
printf("%c",arr[i]);
}
return 0;
}

输入helloworld 运行结果

请输入一段文字:helloworld
helloworld
helloworld 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫 烫烫烫烫蘌ress any key to continue

  1. 你输入helloworld,%s打印helloworld
  2. %c打印helloworld之后有一个空格,然后后面全是烫烫烫烫
  3. 事实表明​每一个字符串后面都有一个’\0’
  4. 烫烫烫烫烫烫烫烫烫烫烫烫是没有意义的,因为他们没有赋值,换成%d打印arr里面的元素,你会发现烫烫烫对应的数字为-52,而ASCII码表只有0~128,所以显示乱码

  • 字符串的赋值方式
  1. 单个元素赋值(不推荐)
char arr[6];
arr[0]='h';
arr[1]='e';
arr[2]='l';
arr[3]='l';
arr[4]='o';
arr[5]='\0';
printf("arr字符串内容为:%s\n",arr); //输出hello
  1. 初始化赋值字符串
char arr[6]="hello";
printf("arr字符串内容为:%s\n",arr); //输出hello
  1. 中文 一个汉字需要占用两个char


汉字占用两个字节 (视为字符串) 不能用%c打印中文


  • 注意事项
  1. 输入数组的时候不用加&取地址符号,只需要输入数组名(数组名就是地址)
char str[128];  //字符数组
scanf("%s", str);//让用户输入一个字符串

  1. 字符数组单个元素赋值一定要加’\0’否则会出现乱码 “烫烫烫”
  2. 尽量保证字符数组足够大,否则输入的内容大于字符数组大小会出现越界。

char arr[10] = "helloworld";  //数组大小太小了 会报错
字符数组和字符串的区别

  1. 多个字符,不一定代表一个字符串,他可能是一个字符数组,而不是字符串
  2. 字符数组:他是不包含末尾结束符’\0’
  3. 字符串:多个字符,但是它的末尾是有结束符’\0’

char name[5]={'a','b','c','d','e'}; //字符数组
char name[5]={'a','b','c','d','\0'};//字符数组
  1. 通过双引号"hello world"在末尾自动加上’\0’ ‘\0’占一个位置

字符串函数

字符串输入输出函数
  • gets


用法:​gets(字符数组名)​ 用于输入一个字符串


  • puts


用法:​puts(数组名)​ 用于输出一个字符串


字符串处理函数

需要加头文件#include<string.h>

  • strcmp


用法:​strcmp(字符串,字符串2)​ 比较两个字符串


#include<stdio.h>
#include<string.h>
int main()
{
char a[20],b[20];
puts("请输入字符串a:");
gets(a);
puts("请输入字符串b:");
gets(b);
int temp=strcmp(a,b);
if(temp==0)
printf("这两个字符串相同\n");
else if(temp>0)
printf("字符串a比b大");
else if(temp<0)
printf("字符串a比b小");
return 0;
}

需要注意的是比较规则不是看ASCII码值的大小

  • strcpy


用法:​strcpy(字符数组1,字符串2 )​ 将字符串2复制到字符数组1中去(覆盖)


char str1[10]="hello";
char str2[10];
str2=str1; //没有这种语法,会报错

char str3[10];
str3="hello";`//左值地址是不能修改的 会报错
  • strcat


用法:​strcat(字符数组1,字符数组2)​ 将字符串2拼接到字符数组1中去(追加)


char str1[10]="hello",str2[]="world";
strcat(str1,str2); //str1的内容是"helloworld"
  • strlen


用法:​strlen(字符串)​ 求字符串长度(\0前面有效字符的个数)


printf("字符串的长度为:%d",strlen("hello")); 
//打印字符串的长度为:5
  • 不常用函数

函数

作用

strstr(字符串1,字符串2)

断一个字符串里面是否含有某个字符

strlwr(字符串)

将字符串中大写字母转换成小写字母

strupr(字符串)

将字符串中小写字母转换成大写字母

sprintf()

格式化输出

strstr使用示例

if (strstr("张三李四王五", "四王") != 0)  //字符串2属于字符串1返回不为0的数,否则返回0
{
puts("字符串1中含有字符串1");
}
else
{
puts("字符串1中不含字符串2");
}

sprintf()的使用示例


这个函数很实用,对于计算机软件专业的来说用的特别多


//简单使用的示例,我必须说明额是它的功能很强大
#include<stdio.h>
int main()
{
int a;
char arr[100];
scanf("%d",&a);
sprintf(arr,"我有%d亿人民币",a);
printf("%s",arr);
putchar(10);
return 0;
}
注意事项
  1. gets和scanf的区别

同样是输入字符串,​gets输入的字符串可以包含空格​,​scanf遇空格结束输入

  • 示例
#include<stdio.h>
int main()
{
char arr[128];
printf("请输入字符串:");
gets(arr);
printf("你输入的字符串为:%s\n",arr);

printf("请输入字符串:");
scanf("%s",arr);
printf("你输入的字符串为:%s\n",arr);
return 0;
}

输入输出:

请输入字符串:hello world
你输入的字符串为:hello world
请输入字符串:hello world
你输入的字符串为:hello
Press any key to continue
  1. 字符串处理函数一定要加头文件
#include<stdio.h>
  1. strcpy,strcat这两个函数要注意字符数组的大小