C语言基础-----数组

一、一维数组

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;
}

三、二维数组

3.1格式

3.2二维数组初始化和赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值