一、一维数组
1.1格式
1.2数组中元素初始化和赋值
1.3数组元素的访问
1.4数组的大小
注:数组为0的特例
1.5冒泡排序
逻辑:每次相邻的两个元素两两比较,将待排序序列中的最大值/最小值,放到序列中最末尾的位置,直到所有元素都排序成功,冒泡排序结束。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[5]={13,9,21,1,19};
int i,j,temp;
int len = sizeof(arr)/sizeof(arr[0]);
//进行冒泡排序
//外层控制排序次数
for(i=1;i<len;i++)
{
//内层循环控制元素间比较
for(j=0;j<len-i;j++)
{
//升序
if(arr[j]>arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(i=0;i<len;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
1.6选择排序
逻辑:每次选出待排序序列中的最大/最小值和第一个元素互换。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int arr[5]={13,9,21,1,19};
int i,j,temp;
int len = sizeof(arr)/sizeof(arr[0]);
int min_index; //最小值的下标
//选择排序
for(i=1;i<len;i++)
{
//每次假定最小值的下标是待排序序列中的第一个元素
min_index = i-1;
//内层循环找最小值的下标
for(j=i;j<len;j++)
{
//假定的最小值比待排序序列中的元素还要大
if(arr[min_index]>arr[j])
{
min_index = j; //更新最小值的下标
}
}
//内层循环结束找到待排序序列中的最小值
//和第一个元素交换
if(min_index!=i-1) //如果最小值下标不是第一个元素下标,可以不判断
{
temp = arr[min_index];
arr[min_index] = arr[i-1];
arr[i-1] = temp;
}
}
}
二、一维字符数组
2.1格式
2.2字符数组的初始化和赋值方式
#include <stdio.h>
int main(int argc, const char *argv[])
{
/**********字符数组的初始化和赋值***********/
char str[3]={'0','9','a'}; //完全初始化
char str1[6]="hello"; //使用字符串给字符数组初始化
char str2[]="hello"; //会根据初始化列表给字符数组分配空间
printf("%ld\n",sizeof(str2)); //6,因为会给'\0'分配空间
char str3[4]={"hi"};
/*****赋值*****/
str[2]='A';
printf("%c\n",str[2]);
//str="hello"; 报错
return 0;
}
2.3字符串函数族的函数
2.3.1strlen
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[100];
gets(str);
printf("%ld\n",strlen(str)); //11字符串不包含'\0'的大小
return 0;
}
自己实现strlen函数
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[100];
gets(str);
int len=0;
int i=0; //定义了一个循环变量i从0开始
//自己实现strlen函数
while(str[i]!='\0')
{
i++; //循环字符数组中的每一个字符
len++; //记录字符数组的长度
}
printf("%d\n",len);
return 0;
}
2.3.2strcpy
注:
使用strcpy函数时,目标数组必须足够长,容纳下源数组中的内容。
dest数组必须足够长,容纳下src数组中的内容
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[100]="hello";
char str1[20]="hello world";
strcpy(str,str1); //使用strcpy函数,将str1字符串拷贝到str中
puts(str);
return 0;
}
自己实现:
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[100]="hello";
char str1[20]="hi";
int i=0;
//拷贝要保证源字符串的每一位都拷贝到目标字符串中
//循环应该保证源字符串的每一位都进入循环
while(str1[i]!=0)
{
str[i]=str1[i];
i++; //第i位拷贝结束后,继续拷贝第i+1位
}
//退出while循环时,说明str1走到了'\0'
//再将'\0'赋值给str的第i位
str[i]=str1[i]; //赋结尾的'\0'
puts(str);
return 0;
}
2.3.3stract
注:目标字符串一定要足够长容纳下strcat拼接后的结果。
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[20]="hello";
char str1[10]=" world";
//将str1数组,拼接到str数组后面
strcat(str,str1);
puts(str); //"hello world";
return 0;
}
自己实现:
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[20]="hello";
char str1[10]=" world";
//自己实现strcat
int i=0,j=0;
//1、找到目标字符串'\0'的位置
while(str[i]!=0)
{
i++;
}
//当退出循环时,str[i]=='\0'
//将源字符串中的每一位,拼接到目标字符串'\0'开始的每一个位置
while(str1[j]!='\0')
{
str[i]=str1[j];
i++;
j++;
}
//当第二个while循环退出时,说明源字符串也走到了'\0'
str[i]=str1[j];
puts(str);
return 0;
}
2.3.4strcmp
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[10]="hello";
char str1[10]="hel";
printf("%d\n",strcmp(str,str1)); //108是,'l'-'0'的值
return 0;
}
自己实现:
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char str[10]="hello";
char str1[10]="hel";
int i=0;
//判断何时两个字符串一直往下走找下一位
//当两个字符串下标为i的位置相等,并且都不为0时
while(str[i]==str1[i]&&str[i]!=0) //'\0'的ascii码就是0
{
i++; //向后比较下一位
}
//如果不满足循环条件,说明两个字符串的第i位不相等
//或者是两个字符串的第i位相等,但是都是'\0'
int ret = str[i]-str1[i];
printf("%d\n",ret);
return 0;
}
2.3.5memset
2.3.6bzero
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
unsigned int a = 0xffffffff;
//使用memset进行内存置位
memset(&a,0x14,3); //从变量a的首地址开始,置前3个Byte中每个Byte的内容为0x14
printf("%#X\n",a);
//使用bzero进行内存置位
bzero(&a,1); //从变量a的首地址开始,置前1个字节的内容为0
printf("%#X\n",a);
return 0;
}